gpt4 book ai didi

swift - 具有计算属性的协议(protocol)

转载 作者:行者123 更新时间:2023-11-28 05:48:55 25 4
gpt4 key购买 nike

swift 是否有特定原因限制我们在 protocol 声明中提供计算属性?因为我们只有机会将这些计算属性设置为 protocolextension

单词 -> 代码:

为什么这行不通-(背后的逻辑是什么)

protocol GridableGraph {

var yTick: Float { get }
var yTicksCount: Int { get }

var xTick: Float{ get }
var xTicksCount: Int { get }

var maxYValue: Float { return Float(yTicksCount - 1) * yTick }
var maxXValue: Float { return Float(xTicksCount - 1) * xTick }
}

虽然这样

protocol GridableGraph {

var yTick: Float { get }
var yTicksCount: Int { get }

var xTick: Float{ get }
var xTicksCount: Int { get }
}

extension GridableGraph{
var maxYValue: Float { return Float(yTicksCount - 1) * yTick }
var maxXValue: Float { return Float(xTicksCount - 1) * xTick }
}

最佳答案

协议(protocol)旨在提供接口(interface)(一组方法和属性),但将实现留给实现类。

当您对协议(protocol)进行扩展时,我们决定让这些协议(protocol)需要一个实现,以免弄乱库或框架内的代码。

假设您想用您喜欢的方法扩展UITableViewDataSource 协议(protocol)。如果 Swift 不需要实现,那么 UIKit 中使用此协议(protocol)的所有 UIViewControllers 会怎样?从技术上讲,您可以调用该方法,但随后会收到错误消息,因为该方法不存在。

Swift 通过在扩展协议(protocol)时要求实现来解决这个问题。这样你就可以不实现它(使用默认实现)或实现它(使用你的类中的实现)。这是因为 Apple 希望 Swift 尽可能安全。

编辑:您没有问为什么扩展需要默认实现,您问的是为什么不能只将默认实现放在协议(protocol)中,而是需要将它放在 extension 中。我猜这是因为 Swift 喜欢保持一致,并且因为它们已经允许在协议(protocol)扩展中使用默认实现,所以它们可能还需要默认实现。

请记住,在同一个文件中使用多个扩展名没有任何问题,它甚至被建议作为分割代码的首选方式,以便在 Ray Wenderlich Swift Style Guide 中获得更好的概述。 .

关于swift - 具有计算属性的协议(protocol),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53613448/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com