Swift:递归设置计算属性

时间:2017-01-19 23:51:41

标签: swift

在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.

我理解错误,但我如何以不同的方式设计?我正在访问该物业&#34;在其自己的吸气剂中#34;故意。

2 个答案:

答案 0 :(得分:0)

检查设置器中的正确数据,如

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")
        }
    }
}

答案 1 :(得分:0)

要修复警告,只需替换

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