【问题标题】:Swift: Recursively setting computed propertySwift:递归设置计算属性
【发布时间】:2017-01-20 08:17:03
【问题描述】:

在 Swift 3 中,我声明了一个始终返回非零正值的计算属性。该属性存储在 UserDefaults 中(这意味着应用程序第一次运行时它将为零):

var notificationInterval: TimeInterval {
    get {
        let interval = UserDefaults(suiteName: "groupName")?.double(forKey: "notificationInterval") as TimeInterval?

        if interval == nil || interval! <= 0 {
            notificationInterval = defaultInterval
            return notificationInterval
        } else {
            return interval!
        }
    }

    set {
        UserDefaults(suiteName: "groupName")?.set(newValue, forKey: "notificationInterval")
    }
}

在第 6 行和第 7 行:

notificationInterval = defaultInterval
return notificationInterval

我收到以下错误:

Attempting to access 'notificationInterval' within its own getter.

我理解这个错误,但我将如何以不同的方式设计它?我是故意“在自己的 getter 内”访问该属性的。

【问题讨论】:

  • 避免显式检查nil,然后强制解包。只需使用条件绑定。

标签: swift


【解决方案1】:

在setter中检查正确的数据,比如

var notificationInterval: TimeInterval {
    get {
        if let interval = UserDefaults(suiteName: "groupName")?.double(forKey: "notificationInterval") as? TimeInterval {
                return interval
        }  else {
            return defaultInterval
        }
    }

    set {
        if let interval = newValue, interval <= 0 {
            UserDefaults(suiteName: "groupName")?.set(defaultInterval , forKey: "notificationInterval")
        } else {
            UserDefaults(suiteName: "groupName")?.set(newValue, forKey: "notificationInterval")
        }
    }
}

【讨论】:

    【解决方案2】:

    要修复警告,只需替换

    notificationInterval = defaultInterval
    return notificationInterval
    

    return defaultInterval
    

    ...这意味着应用程序第一次运行时它将为零

    您可以使用register 函数注册您的默认值,以便在程序第一次运行时从UserDefaults 获得它。

    let dict: [String: Any] = ["notificationInterval": 5.0]
    UserDefaults.standard.register(defaults: dict)
    
    let interval = UserDefaults.standard.double(forKey: "notificationInterval")
    // interval = 5
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-12-31
      • 2016-09-04
      • 2019-02-14
      • 2021-11-21
      • 1970-01-01
      • 2020-04-23
      • 2016-04-22
      • 1970-01-01
      相关资源
      最近更新 更多