美文网首页Swift好文收藏
Swift中通过 @propertyWrapper 让你的代码变

Swift中通过 @propertyWrapper 让你的代码变

作者: liaoworkinn | 来源:发表于2019-07-14 19:19 被阅读0次
2019.12.02 update: 感谢掘友 Swteefish 的提醒 propertyWrapper 的正式中文名叫 属性包装

---下面是正文---

什么是@propertyWrapper?

从字面意思去理解 property Wrapper 就是属性包裹器(我初二英语水平硬翻,写的时候国内好像还没有一个统一的叫法。有知道学名的同学提醒下谢啦~)。
它的作用对象属性
主旨就是:通过property Wrapper机制,对一些类似的属性的实现代码做同一封装。
说简单点: 通过@propertyWrapper可以移除掉一些重复或者类似的代码。
@propertyWrapper 的使用步骤

propertyWrapper这个知识点不难,比较新而已。只要自己复制下面的Demo在playGround里跑一遍看一下就会了。

下面用UserDefaults保存是否显示新手引导的例子来让大家有一个直观的了解

没有@propertyWrapper 的时候。。😔

extension UserDefaults {

    public enum Keys {
        static let hadShownGuideView = "had_shown_guide_view"
    }

    var hadShownGuideView: Bool {
        set {
            set(newValue, forKey: Keys.hadShownGuideView)
        }
        get {
            return bool(forKey: Keys.hadShownGuideView)
        }
    }
}

/// 下面的就是业务代码了。
let hadShownGuide =  UserDefaults.standard.hadShownGuideView 
if !hadShownGuide {
    /// 显示新手引导 并保存本地为已显示
    showGuideView() /// showGuideView具体实现略。
    UserDefaults.standard.hadShownGuideView = true
}

可是项目中有很多地方需要UserDefaults保存本地数据,数据量多了这样的重复代码就很多了。

有@propertyWrapper 的时候。。😁

@propertyWrapper /// 先告诉编译器 下面这个UserDefault是一个属性包裹器
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
}

///具体的业务代码。
UserDefaultsConfig.hadShownGuideView = false
print(UserDefaultsConfig.hadShownGuideView) // false
UserDefaultsConfig.hadShownGuideView = true
print(UserDefaultsConfig.hadShownGuideView) // true

我把@propertyWrapper 的具体用法和知识点已经写到了demo中。 PlayGround中跑一跑就很稳了。

当添加新的key去保存数据的时候只用在UserDefaultsConfig 中添加新的属性和包裹器就行

struct UserDefaultsConfig {
@UserDefault("had_shown_guide_view", defaultValue: false)
static var hadShownGuideView: Bool
///保存用户名称
@UserDefault("username", defaultValue: "unknown")
static var username: String
}

Over.

参考资料:

最早关于Property Wrapper 的提案:swift-evolution 0258 (特别长一段英文,略略略)
Property wrappers to remove boilerplate code in Swift
nshipster-propertywrapper

相关文章

  • Swift中通过 @propertyWrapper 让你的代码变

    2019.12.02 update: 感谢掘友 Swteefish 的提醒 propertyWrapper 的正式...

  • swift属性包装器 propertyWrapper

    swift属性包装器 propertyWrapper 什么是属性包装器「propertyWrapper」? 在类、...

  • swift中的propertyWrapper

    属性包装器 用法 作用 给属性赋一个默认值 避免一些重复的代码 原理 在使用了propertyWrapper后,取...

  • Swift @propertyWrapper

    属性包装特性给了我们一个机会,可以在一定程度上简化语言的模板代码,并且通过“标注”的方式来改变特性。它与自定义 g...

  • Swift 开发中文件导入处理

    1. Swift 代码中引用 Swift 文件 1.1 引用自己工程中的 Swift 文件 1.2 引用通过 ...

  • Swift-泛型笔记

    Swift 泛型 Swift 提供了泛型让你写出灵活且可重用的函数和类型。 Swift 标准库是通过泛型代码构建出...

  • 泛型

    Swift 提供了泛型让你写出灵活且可重用的函数和类型。Swift 标准库是通过泛型代码构建出来的。Swift 的...

  • Swift 泛型

    Swift 提供了泛型让你写出灵活且可重用的函数和类型。Swift 标准库是通过泛型代码构建出来的。Swift 的...

  • Swift 泛型

    Swift 提供了泛型让你写出灵活且可重用的函数和类型。Swift 标准库是通过泛型代码构建出来的。Swift 的...

  • Swift 泛型

    Swift 提供了泛型让你写出灵活且可重用的函数和类型。Swift 标准库是通过泛型代码构建出来的。Swift 的...

网友评论

    本文标题:Swift中通过 @propertyWrapper 让你的代码变

    本文链接:https://www.haomeiwen.com/subject/wisikctx.html