【问题标题】:Create struct/protocol/class with no external properties in Swift在 Swift 中创建没有外部属性的结构/协议/类
【发布时间】:2018-10-20 05:17:54
【问题描述】:

我有一个类想要返回一个令牌,它可以单独创建和读取,但可以交给一个客户端类,除了把它还给它之外,它不能做任何事情。令牌包含一个值。我该如何设计它,使它只有私有属性/方法,但看起来对公众完全不透明。我不想进行任何强制转换,它需要在所属类内部是类型安全的。斯威夫特 4.x.

【问题讨论】:

  • 也许你想让它“只得到”
  • 你的问题有点含糊。如果您希望客户端类能够只读而不是修改它,那么您可以按照@user770 所说的操作并将其设为get-only 属性。但是,如果您根本不希望客户端类读取它,那么我看不出允许客户端类访问它的意义。只是为了还给它。
  • 这更像是一个理论问题,想知道在 swift 中是否有办法构建一个安全的类型(用于分配类),相当于使用 id 或 void* 并隐藏实现。

标签: swift generics types protocols


【解决方案1】:

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

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,因为这样就没有人可以得到令牌。

【讨论】:

  • 也许它只是不可能在语言中拥有一个事物而不暴露事物的某些东西并且不在某处使用强制转换。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多