swift - 协议(protocol)扩展中类型约束的好处是什么?

标签 swift protocols

我是一个编程初学者,请原谅这个幼稚的问题。 Swift 是我的第一门语言,我没有引用(其他编程语言)来比较类型约束对协议(protocol)扩展的好处。

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

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 的约束,编译器将无法保证 winlosses 属性将存在。

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

考虑另一个例子,Dictionary 的键必须是HashableDictionary 依赖于获取键的哈希值来确定如何存储它们。约束非常重要。没有它,我可以尝试使用自定义结构/对象作为 Dictionary 键。我的自定义结构/对象无法进行哈希处理,那么程序要做什么?

添加约束为编译器提供了额外的信息来指导我。它将要求我添加对 Hashable 的一致性,没有它就无法编译。

关于swift - 协议(protocol)扩展中类型约束的好处是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37666033/

相关文章:

iphone - ASIHTTPRequest 自定义进度跟踪

ios - 是否可以将类型删除应用于协议(protocol)中的返回值?

Swift CollectionView 使用滑动手势删除项目

ios - Swift 3 上下文类型 'AnyObject' 不能与字典文字一起使用

xcode - 如何像在 Visual Studio 中那样使用 Xcode 在 Swift 中折叠注释 block ?

c - secret 服务器协议(protocol)保持软件免费

swift - 如何旋转并向从 Reality Composer 加载的实体添加线性力?

iOS Swift 编程 - 架构 x86_64 的 undefined symbol

swift - 有没有办法允许 Swift 协议(protocol)扩展访问实现所述协议(protocol)的类中的某些内容,但其他任何东西都无法访问?

reflection - Swift 发现协议(protocol)方法