swift-属性包装器(propertyWrapper)

880 阅读1分钟

属性包装器

作用

  1. 给属性赋一个默认值
  2. 避免一些重复的代码

原理

在使用了propertyWrapper后,取属性值的时候实际取的是propertyWrapper中的wrappedValue。所以wrappedValue是必须要实现的接口

使用

//先告诉编译器 下面这个UserDefault是一个属性包裹器
@propertyWrapper
struct UserDefault<T> {
    ///这里的属性key 和 defaultValue 还有init方法都是实际业务中的业务代码
    ///我们不需要过多关注
    let key: String
    let defaultValue: T

    init(_ key: String, defaultValue: T) {
        self.key = key
        self.defaultValue = defaultValue
    }
///  wrappedValue是@propertyWrapper必须要实现的属性
/// 当操作我们要包裹的属性时  其具体set get方法实际上走的都是wrappedValue 的set get 方法。
    var wrappedValue: T {
        get {
            return UserDefaults.standard.object(forKey: key) as? T ?? defaultValue
        }
        set {
            UserDefaults.standard.set(newValue, forKey: key)
        }
    }
}

上面的事属性包装器的定义 下面是调用

///封装一个UserDefault配置文件
struct UserDefaultsConfig {
///告诉编译器 我要包裹的是hadShownGuideView这个值。
///实际写法就是在UserDefault包裹器的初始化方法前加了个@
/// hadShownGuideView 属性的一些key和默认值已经在 UserDefault包裹器的构造方法中实现

  @UserDefault("had_shown_guide_view", defaultValue: false)
  static var hadShownGuideView: Bool
}

func tt() {
    @UserDefault("had_shown_guide_view", defaultValue: "wyw") var isshow:String
    print(isshow)
    
    isshow = "hello word"
    print(isshow)
    
    print(UserDefaultsConfig.hadShownGuideView)
    UserDefaultsConfig.hadShownGuideView = true
    print(UserDefaultsConfig.hadShownGuideView) // false
}

tt()

总结

这些特性不是必须要用,但是要想自己代码写的优雅,更加swift化,还是要多多思考的