属性包装器的执行过程

46 阅读1分钟
  • @Validation 的作用

    • 当你在 User 结构体的 name 属性前加上 @Validation(defaultValue: "未命名使用者") 时:

      swift

      复制

      @Validation(defaultValue: "未命名使用者") var name = ""
      
      • 编译器会将 name 替换为 _name(存储属性),并用 Validation 包装它。

      • 实际存储的是 _name(类型为 Validation),而 name 变成计算属性,访问的是 _name.wrappedValue

  • 代码的执行流程

    • 初始化时

      • name = "" 会调用 Validationinit(wrappedValue:defaultValue:),将 wrappedValue 设为 ""defaultValue 设为 "未命名使用者"

      • 此时 _name.text = ""(传入的 wrappedValue),_name.defaultValue = "未命名使用者"

    • 读取 user.name

      • 访问的是 _name.wrappedValueget 方法:

        swift

        复制

        get { text.isEmpty ? defaultValue : text }
        
      • 因为 text""(空字符串),所以返回 defaultValue"未命名使用者")。

    • 设置 user.name = "Jane"

      • 调用 _name.wrappedValueset 方法:

        swift

        复制

        set { text = newValue }  // text 变为 "Jane"
        
    • 再次读取 user.name

      • text 现在是 "Jane"(非空),所以返回 "Jane"

  1. @Validationname 替换为一个 包装器实例 _name

  2. 外部对 name 的读写实际调用的是 _name.wrappedValueget/set 方法。

  3. 初始时 name = "" 会触发包装器的 init,而后续操作通过 wrappedValue 代理。

这就是 Swift 属性包装器(@propertyWrapper)的核心机制! 🚀