[英]Access Computed Property of a Protocol in a Protocol Extension
假设我有一个类似的协议
protocol TypedString : CustomStringConvertible, Equatable, Hashable { }
func == <S : TypedString, T : TypedString> (lhs : T, rhs : S) -> Bool {
return lhs.description == rhs.description
}
我希望能够提供Hashable
的默认实现:
extension TypedString {
var hashValue = { return self.description.hashValue }
}
但是问题是我得到了一个错误的Use of unresolved identifier self
。
如何使用CustomStringConvertible
协议中定义的description
属性给出的字符串表示形式创建Hashable
的默认实现?
这样做的动机是我想在String周围创建浅层包装,因此我可以在语义上对我的代码进行类型检查。 例如,不是编写func login (u : String, p : String) -> Bool
,而是编写func login (u : UserName, p : Password) -> Bool
,其中UserName
和Password
的(失败)初始化程序进行验证。 例如我可能写
struct UserName : TypedString {
let description : String
init?(userName : String) {
if userName.isEmpty { return nil; }
self.description = userName
}
}
您想要的是完全可能的,您收到的错误消息并不能很清楚地说明问题是什么:您的计算属性语法不正确。 计算属性需要显式键入,并且不要使用等号:
extension TypedString {
var hashValue: Int { return self.description.hashValue }
}
这样很好!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.