Swift-使用Guard let语句解开Double值

时间:2019-12-08 10:00:13

标签: swift xcode guard statements

要从我的默认值中解开一个Double,我似乎必须使用两个guard let语句来安全地解开该值,如下所示:

guard let distanceAwayPreference = self.defaults.string(forKey: "distancePreference") else {
    return
}
guard let doubleDAP = Double(distanceAwayPreference) else {
    return
}

–因为如果我这样做:

guard let DistanceAwayPreference = self.defaults.double(forKey: "distancePreference") else {
    return
}

–我收到错误消息:

  

用于条件绑定的初始化程序必须具有可选类型,而不是'Double'

有没有更好的方法,所以我可以做一次,或者整个应用程序中的代码更少?

2 个答案:

答案 0 :(得分:2)

方法double(forKey:)根本没有返回optional。根据文档,它返回:

  

与指定键关联的双精度值。如果密钥不存在,则此方法返回0。

因此您不能选择将其绑定到变量。这就是为什么您会出现该错误的原因:

  

用于条件绑定的初始化程序必须具有可选类型,而不是'Double'


对于更少,更简洁的代码(使用时),您可以使用简单的属性包装器,例如:

@propertyWrapper
struct UserDefault<T> {
    let key: String
    let defaultValue: T

    init(_ key: String, defaultValue: T) {
        self.key = key
        self.defaultValue = defaultValue
    }

    var wrappedValue: T {
        get { UserDefaults.standard.object(forKey: key) as? T ?? defaultValue }
        set { UserDefaults.standard.set(newValue, forKey: key) }
    }
}

然后,您可以拥有一个这样的自定义帮助器结构:

struct UserDefaultsConfig {
    @UserDefault("distancePreference", defaultValue: 0)
    static var distancePreference: Double
}

并像以下那样晚使用它:

UserDefaultsConfig.distancePreference = 12

答案 1 :(得分:0)

我认为最好从默认值而不是String返回Any。因此,这种方式可以使用可选的强制转换。

guard let doubleDAP = self.defaults.object(forKey: "distancePreference") as? Double else {
      return
}