我注意到当我创建一个@Model并转到Xcode的Refactor->Generate成员初始化器时,Xcode会执行以下操作:
@Model
class A {
internal init(a: String = "", b: Date = Date(), _$backingData: any BackingData<SchemaV2.A> = A.createBackingData()) {
self.a = a
self.b = b
self._$backingData = _$backingData
}
var a: String = ""
var b: Date = Date()
}
如果我使用自己的初始化程序手动执行此操作,我绝不会使用类似的东西createBackingData()
。它的用途是什么?
@Model
我建议您右键单击并选择“扩展宏”,查看宏的实际扩展内容@Model
。它的扩展中还有更多宏 - 您也可以尝试扩展它们。请注意,这些以下划线为前缀的宏将来都可能发生变化。生成的一个属性
@Model
是这解释了为什么“生成成员初始化器”会生成一个额外的参数。这只是它处理
var
已在声明时初始化的实例的方式。尝试为 生成一个成员初始化器class Foo { private var x = 1 }
,你会发现同样的情况持续发生。createBackingData
是协议中声明的一个静态方法PersistentModel
,所有@Model
s 都遵循该方法。它没有文档记录,但我们可以从其名称粗略地猜测它的作用。它可能创建了一个用于实际存储模型持久化属性值的对象。BackingData
它很可能是一个包装器NSManagedObject
或类似的东西。由于已经有初始化表达式,因此初始化程序根本
_$backingData
不需要进行初始化。_$backingData
模型的持久属性的值实际上并不存在于模型类对象中。
@Model
首先@_PersistedProperty
向声明的存储属性添加一个宏,然后@_PersistedProperty
使用这些访问器将它们转换为计算属性:它只留下一个下划线前缀的存储属性,它本质上只是一个标记,用于确保你已在初始化器中初始化了所有内容。如果没有它,你无需在初始化器中初始化任何模型属性,因为它们都已转换为计算属性。