-
@Validation的作用-
当你在
User结构体的name属性前加上@Validation(defaultValue: "未命名使用者")时:swift
复制
@Validation(defaultValue: "未命名使用者") var name = ""-
编译器会将
name替换为_name(存储属性),并用Validation包装它。 -
实际存储的是
_name(类型为Validation),而name变成计算属性,访问的是_name.wrappedValue。
-
-
-
代码的执行流程
-
初始化时:
-
name = ""会调用Validation的init(wrappedValue:defaultValue:),将wrappedValue设为"",defaultValue设为"未命名使用者"。 -
此时
_name.text = ""(传入的wrappedValue),_name.defaultValue = "未命名使用者"。
-
-
读取
user.name时:-
访问的是
_name.wrappedValue的get方法:swift
复制
get { text.isEmpty ? defaultValue : text } -
因为
text是""(空字符串),所以返回defaultValue("未命名使用者")。
-
-
设置
user.name = "Jane"时:-
调用
_name.wrappedValue的set方法:swift
复制
set { text = newValue } // text 变为 "Jane"
-
-
再次读取
user.name时:-
text现在是"Jane"(非空),所以返回"Jane"。
-
-
-
@Validation将name替换为一个 包装器实例_name。 -
外部对
name的读写实际调用的是_name.wrappedValue的get/set方法。 -
初始时
name = ""会触发包装器的init,而后续操作通过wrappedValue代理。
这就是 Swift 属性包装器(@propertyWrapper)的核心机制! 🚀