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