这是我微弱的尝试。我不认为有一种方法可以让一个类完全不透明,因为你隐藏了它所有成员的名字,但你可以让它们无法访问。
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,因为这样就没有人可以得到令牌。