2016-06-06 69 views
0

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

个人而言,我只是感到困惑和奇怪。为什么对协议扩展的类型约束存在?它的含义是什么?

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约束,什么是它的好处?我们能否在不使用约束人员的情况下达到相同的结果?

非常感谢您的时间和帮助

回答

2

滑稽的是,在“约束”实际上增加了大量的权力来扩展。

没有约束的CustomStringConvertible贴合型是TeamRecord,编译器将没有低保winslosses性能会存在的方式。

类型约束(通常不仅限于协议扩展)限制了可能符合协议的类型的选择,但作为交换,他们向您购买了编译器实施,无论您调用何种属性/方法都可用符合类型。

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

添加约束为编译器提供了额外的信息来指导我。它需要我添加符合Hashable,并且不会在没有它的情况下进行编译。

+0

嗯!该约束非常有用。谢谢你的解释和例子 – SLN