协议扩展中类型约束的好处是什么?

时间:2016-06-06 20:10:13

标签: swift protocols

我是编程初学者,请原谅天真的问题。 Swift是我的第一语言,我没有参考(其他编程语言)来比较Constrains类型在协议扩展上的好处。

就个人而言,我感到困惑和怪异。为什么存在协议扩展的Type约束?它的含义是什么?

protocol TeamRecord {
  var wins: Int { get }
  var losses: Int { get }
  func winningPercentage() -> Double
}

//Constraint:
extension CustomStringConvertible where Self: TeamRecord {
  var description: String {
    return "\(wins) - \(losses)"
  }
}

struct BaseballRecord: TeamRecord {
  var wins: Int
  var losses: Int

  func winningPercentage() -> Double {
    return Double(wins) / Double(wins) + Double(losses)
  }
}

 extension BaseballRecord: CustomStringConvertible { }

 print(BaseballRecord(wins: 4, losses: 2))

问题我觉得在这里使用where Self约束很奇怪,有什么好处呢?我们可以在不使用约束人员的情况下实现相同的结果吗?

非常感谢你的时间和帮助

1 个答案:

答案 0 :(得分:2)

有趣的是,“约束”实际上为扩展增加了很多力量。

如果没有CustomStringConvertible的符合类型为TeamRecord的约束,编译器将无法保证winslosses属性将存在。< / p>

类型约束(通常,不仅仅是协议扩展)确实限制了可能符合协议的类型的选择,但作为交换,它们会向您购买编译器强制执行,即您调用的任何属性/方法都将在符合类型。

考虑另一个例子,Dictionary的密钥必须是HashableDictionary依赖于能够获取键的哈希值以确定如何存储它们。约束非常重要。没有它,我可以尝试使用自定义struct / object作为Dictionary键。我的自定义结构/对象不能被散列,那么程序要做什么?

添加约束为编译器提供了额外的信息来指导我。它需要我添加Hashable的一致性,没有它就不会编译。