在Swift中创建没有外部属性的struct / protocol / class

时间:2018-05-10 01:53:36

标签: swift generics types protocols

我有一个类,它想要返回一个它可以创建和读取的令牌,但是可以传递给一个客户端类,除了将它返回之外,它不能对它做任何事情。令牌包含值。我如何设计它,因此它只有私有属性/方法,但看起来对公众完全不透明。我不想做任何演员,它必须是拥有类内部的类型安全。 Swift 4.x。

1 个答案:

答案 0 :(得分:0)

这是我的微弱尝试。我不认为有一种方法可以创建一个完全不透明的类,因为你隐藏了所有成员的名字,但是你可以让它们无法访问。

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

毫无疑问,您希望将一些数据传递到您将在requestToken方法中验证的isValid方法,但就像他们所说的那样,为读者留下了一个练习。

请注意,您无法Token成为fileprivate struct因为没有人可以获得令牌。