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

Swift 协议扩展中类型约束的好处是什么?,swift,protocols,Swift,Protocols,我是一个编程初学者,请原谅这个天真的问题。Swift是我的第一种语言,我没有参考(其他编程语言)来比较类型约束对协议扩展的好处 就我个人而言,我只是感到困惑和奇怪。为什么协议扩展上存在类型约束?这是什么意思 protocol TeamRecord { var wins: Int { get } var losses: Int { get } func winningPercentage() -> Double } //Constraint: extension CustomS

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

就我个人而言,我只是感到困惑和奇怪。为什么协议扩展上存在类型约束?这是什么意思

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
约束很奇怪,它有什么好处?我们能在不使用约束人员的情况下达到同样的结果吗

非常感谢您的时间和帮助

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

没有
CustomStringConvertible
的一致性类型是
TeamRecord
的约束,编译器将无法保证
属性将存在

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

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

添加约束为编译器提供了更多信息来指导我。它需要我向Hashable添加一致性,没有它就无法编译。

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

没有
CustomStringConvertible
的一致性类型是
TeamRecord
的约束,编译器将无法保证
属性将存在

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

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


添加约束为编译器提供了更多信息来指导我。它需要我向Hashable添加一致性,没有它就无法编译。

hmm!约束非常有用。谢谢你的解释和举例!约束非常有用。谢谢你的解释和例子