簡體   English   中英

在Swift中創建沒有外部屬性的struct / protocol / class

[英]Create struct/protocol/class with no external properties in Swift

我有一個想要返回一個令牌的類,該令牌可以單獨創建和讀取,但是可以交給一個客戶端類,該客戶端類只能將其歸還給它。 令牌包含一個值。 我該如何設計它,使其僅具有私有屬性/方法,但對公眾完全不透明。 我不想進行任何強制轉換,它需要在所屬類內部為類型安全。 Swift4.x。

這是我微弱的嘗試。 我不認為有一種方法可以使一個完全不透明的類隱藏您所有成員的名稱,但是您可以使它們不可訪問。

struct Token {
    //everyone can see this property exists, but only 
    //classes defined in this file can see its value
    fileprivate let value: String
    init(value: String) {
        self.value = value
    }
}

我假設您需要一個用於發布和驗證令牌的類。 它需要能夠看到令牌內部。

class TokenManager {
    func requestToken() -> Token {
        return Token(value: "a magic token value")
    }
    func isValid(token: Token) -> Bool {
        //to inspect the token's value, this class needs to be defined  
        //in the same file as the Token
        return token.value == "a magic token value"
    }
}

令牌的使用者將請求這樣的令牌:

    let myToken = TokenManager().requestToken()

它會知道令牌具有value屬性,但是將無法訪問它:

    //print(myToken.value) //'value' is inaccessible due to 'fileprivate' protection level

但是TokenManager可以檢查令牌的值:

    let isValid = TokenManager().isValid(token: myToken)
    print(isValid) //true

毫無疑問,您希望將一些數據傳遞到您將在isValid方法中驗證的requestToken方法中,但是正如他們所說,這是留給讀者的一項練習。

請注意,您不能將Tokenfileprivate struct因為這樣沒人會獲得令牌。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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