在Swift属性包装器中支持可选参数值

3
我有以下针对用户默认设置的属性包装器:
@propertyWrapper
class MyUserDefaultWrapper<T> {
    let key: String
    let defaultValue: T

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

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

我定义它如下:

struct MyUserDefaultsCommon{
    @MyUserDefaultWrapper("yearOfBirth", defaultValue: 1980)
    static var yearOfBirth: Int
}

并且像这样调用:

MyUserDefaultsCommon.yearOfBirth = 2010

当我将默认值设置为 nil 时,构建失败并出现 sig abrt。

我如何限制从属性包装器类传递可选的默认值?还是有其他方法可以解决这个问题?


1
当您将defaultValue设置为nil时,您是否也将属性类型更改为Optional?例如,在您的示例中,它应该是static var yearOfBirth: Int?而不是Int - user28434'mstep
如果它是nil,你会想要删除该键的对象,而不是将其设置为nil。 - Adrian
@Adrian,我想要在构建错误时限制团队中任何人尝试使用nil作为默认值。由于团队规模较大,仅仅制定规则是不够的。我不能假设每个人都会遵循我的规则。 - Sazzad Hissain Khan
在 @SazzadHissainKhan 中,只需检查 nil。如果 newValue 为 nil,则从 UserDefaults 中删除该键,否则设置它。在 set { // blah blah} 中。 - Adrian
1
代码有没有编译通过呢?由于 UserDefaults.standard 是非可选类型,所以 suit? 应该会抛出错误。 - vadian
显示剩余3条评论
1个回答

2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接