簡體   English   中英

協議擴展中協議的訪問計算屬性

[英]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 ,其中UserNamePassword的(失敗)初始化程序進行驗證。 例如我可能寫

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM