要从我的默认值中解开一个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'
有没有更好的方法,所以我可以做一次,或者整个应用程序中的代码更少?
答案 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
}