具有计算属性的协议

时间:2018-12-04 12:51:37

标签: swift swift-protocols swift-extensions

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

单词->代码:

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

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

请不要通过提供我已经介绍过的文档报价来重写我刚才所说的内容:)

1 个答案:

答案 0 :(得分:1)

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

当您对协议进行扩展时,便决定使这些协议需要实现,以免弄乱库或框架内的代码。

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

Swift通过扩展协议时要求实现来解决了此问题。这样,您将无法实现(使用默认实现)或实现(使用类中的实现)。这是因为苹果公司希望Swift尽可能地安全。

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

请记住,在同一文件中使用多个扩展名没有任何问题,甚至建议将其作为在Ray Wenderlich Swift Style Guide中拆分代码以便更好地查看的首选方法。