是否有特定的原因会迅速限制我们在protocol
声明中提供计算属性?因为我们只有机会将这些计算的属性设置为extension
到protocol
。
单词->代码:
为什么这不起作用-(其背后的逻辑是什么)
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 }
}
请不要通过提供我已经介绍过的文档报价来重写我刚才所说的内容:)
答案 0 :(得分:1)
协议旨在提供接口(一组方法和属性),但将实现留给实现类。
当您对协议进行扩展时,便决定使这些协议需要实现,以免弄乱库或框架内的代码。
假设您要使用自己喜欢的方法扩展UITableViewDataSource
协议。如果Swift不需要实现,使用该协议的UIViewControllers
中的所有UIKit
会发生什么?从技术上讲,您可以调用该方法,但是由于该方法不存在,您将收到错误消息。
Swift通过扩展协议时要求实现来解决了此问题。这样,您将无法实现(使用默认实现)或实现(使用类中的实现)。这是因为苹果公司希望Swift尽可能地安全。
编辑:您没有问为什么扩展名需要默认实现,而是问为什么不能只将默认实现放在您的protocol
中,而是需要放置此实现在extension
中。我猜这是因为Swift喜欢保持一致,并且因为它们已经允许协议扩展中的默认实现,所以它们可能也需要默认实现。
请记住,在同一文件中使用多个扩展名没有任何问题,甚至建议将其作为在Ray Wenderlich Swift Style Guide中拆分代码以便更好地查看的首选方法。