Swift 具有计算属性的协议

Swift 具有计算属性的协议,swift,swift-protocols,swift-extensions,Swift,Swift Protocols,Swift Extensions,swift是否有具体原因限制我们在协议声明中提供计算属性?因为我们只有机会将这些计算属性设置为协议的扩展 单词->代码: 为什么这不起作用?(背后的逻辑是什么) 而这是 protocol GridableGraph { var yTick: Float { get } var yTicksCount: Int { get } var xTick: Float{ get } var xTicksCount: Int { get } } extension Gr

swift是否有具体原因限制我们在
协议
声明中提供计算属性?因为我们只有机会将这些计算属性设置为
协议的
扩展

单词->代码:

为什么这不起作用?(背后的逻辑是什么)

而这是

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 }
}

请不要通过给我提供一些我已经介绍过的文档引用来重写我刚才所说的:)

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

当您有一个协议的扩展时,决定让这些协议需要一个实现,以避免弄乱库或框架中的代码

假设您想用自己喜欢的方法扩展
UITableViewDataSource
协议。如果Swift不需要实现,那么
UIKit
中使用此协议的所有
UIViewControllers
会发生什么情况?从技术上讲,您可以调用该方法,但由于该方法不存在,因此会出现错误

Swift通过在扩展协议时要求实现解决了这个问题。这样,您既可以不实现它(使用默认实现),也可以实现它(使用类中的实现)。这是因为苹果希望斯威夫特尽可能安全

编辑:您没有问为什么扩展需要默认实现,而是问为什么不能将默认实现放在
协议中,而是需要将其放在
扩展中。我想这是因为Swift喜欢保持事物的一致性,并且因为他们已经允许协议扩展中的默认实现,所以他们可能还需要默认实现


请记住,在同一个文件中使用多个扩展名并没有什么错,它甚至被建议作为分割代码的首选方法,以便更好地查看。

因为
协议中的
接口
,而扩展名中的内容是默认的
实现
。若符合协议的类型决定使用自己的实现,则默认实现将被忽略。相关SE讨论:。就我个人而言,我反对在协议声明体中允许默认实现,因为如果IMO DECL从类型的扩展移动到类型声明本身,它们应该保持相同的语义。这将违反协议,因为这样的decl将成为定制点。协议定义了适合特定任务或功能的方法、属性和其他需求的蓝图。除了指定一致性类型必须实现的需求外,您还可以扩展协议来实现其中一些需求,或者实现一致性类型可以利用的附加功能。@Hamish非常好的参考。谢谢大家!@user28434您的说法有一点是正确的,使用这种方法有一些缺点,但我仍然可以发现它很方便。您从第三段开始所说的与计算属性无关,因为您可能会选择不使用它们-它们只是为了帮助,与方法不同-您必须在swift@Niv方法和计算属性是一样的。你不明白,你能解释一下第3段吗?“从技术上讲,您可以调用该方法,但随后会出现错误,因为该方法不存在。”这解释了为什么扩展需要有默认实现。我重新阅读了你的问题,现在明白这不是你的问题。我已经编辑了我的答案。
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 }
}