访问协议扩展中协议的计算 属性
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
的默认实现?
动机是我想围绕字符串创建浅层包装器,这样我就可以对我的代码进行语义类型检查。例如,我不写 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 }
}
这很好用!
假设我有一个像
这样的协议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
的默认实现?
动机是我想围绕字符串创建浅层包装器,这样我就可以对我的代码进行语义类型检查。例如,我不写 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 }
}
这很好用!