[英]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.