【问题标题】:Swift - unwrapping a Double value with a Guard let statementSwift - 使用 Guard let 语句展开 Double 值
【发布时间】:2019-12-09 01:55:37
【问题描述】:

要从我的默认值中解开 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
}

– 我得到错误:

条件绑定的初始化器必须是 Optional 类型,而不是 'Double'

有没有更好的方法让我可以一次性完成,或者在我的应用程序中减少代码?

【问题讨论】:

  • 您可以使用 UserDefaults object(forKey:) 它将返回 Any? 而不是零,因此您可以检查该值是否存在。 guard let distance = self.defaults.object(forKey: "distancePreference") as? Double else { return }

标签: swift xcode guard statements


【解决方案1】:

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

与指定键关联的双精度值。如果key不存在,这个方法返回0。

所以你不能选择性地将它绑定到一个变量。这就是您出现该错误的原因:

条件绑定的初始化器必须是 Optional 类型,而不是 '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

【讨论】:

    【解决方案2】:

    我认为最好从默认值返回 Any 而不是 String。所以,这样你就可以使用可选的强制转换了。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多