【问题标题】:If a variable exists return it, else load and return it如果变量存在则返回它,否则加载并返回它
【发布时间】:2018-05-26 21:04:28
【问题描述】:

我想用 settar 和 getter 做下面的事情:

  • 如果变量已在内存中,则返回它。
  • 如果变量未加载,则加载并返回它。

你能写得简单吗?

// Error code
class Person : NSObject {
    let personId : String
    init(personId: String) {
        self.personId = personId
    }
    public var name : String? {
        // The key is not static. It is decided dynamically.
        let keyName = "name-" + self.personId
        get {
            // If `name` exists, return it.
            if name != nil { return name }
            // Else load from `UserDefaults`
            return UserDefaults.standard.string(forKey: keyName)
        }
        set {
            name = UserDefaults.standard.set(newValue, forKey: keyName)
        }
    }
}

【问题讨论】:

    标签: swift


    【解决方案1】:

    您无法仅使用变量来实现您的要求,因为computed properties 在实例中没有任何存储空间。所以你要引入一个私有变量来保存值in memory

    class Person : NSObject {
      public let personId : String
      private var _name: String?
    
      init(personId: String) {
        self.personId = personId
      }
    
      public var name : String? {
        get {
          let keyName = "name-" + self.personId
          return _name != nil ? _name : UserDefaults.standard.string(forKey: keyName)
        }
    
        set {
          let keyName = "name-" + self.personId
          UserDefaults.standard.set(newValue, forKey: keyName)
          _name = newValue
        }
      }
    }
    

    【讨论】:

    • 不需要_name。只需在 getter 中返回 UserDefaults.standard.string(forKey: keyName) 即可。而已。无需检查它是否存在。
    • Maiko 要求:“如果变量已经在内存中”,UserDefaults 是不够的,因为stackoverflow.com/questions/37410584/…
    • 我忽略了! UserDefaults caches the information to avoid having to open the user’s defaults database each time you need a default value.我理解正确,拨打synchronize(),谢谢!
    • 文档说synchronize()unnecessary and shouldn't be used. 最近似乎没有必要。 :)
    • @MaikoOhkawa 关于致电synchronize() - 请参阅stackoverflow.com/questions/40808072/…
    猜你喜欢
    • 2021-11-19
    • 1970-01-01
    • 2015-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-19
    • 2016-01-18
    • 1970-01-01
    相关资源
    最近更新 更多