Han*_*ash 3 enums swift swift-data
注意: - 这个问题最初是在 Xcode 15 处于测试阶段时发布的。在 Xcode 15 的最终版本中,编译器给出了更清晰的错误说明:
默认值需要完全限定的域名值
原问题:
我已将这个问题缩小到一个简单的模型类,其中一个属性具有枚举类型。如果我尝试为该属性指定默认值,则代码将无法再编译:
enum SomeEnum: Hashable, Codable {
case one
case two
}
@Model
class SomeClass {
var value: SomeEnum = .two
init() {
}
}
Run Code Online (Sandbox Code Playgroud)
这会导致错误:
输入“有吗?” 没有成员“二”
如果您深入研究实际日志,您可以看到更多信息:
@__swiftmacro_8Sample39SomeClass5ModelfMm_.swift:15:34:错误:输入“有吗?” 没有成员“二”
(“值”,\SomeClass.value,.two,nil)
~^~
/.../Sample.swift:117:1: 注意:在宏“模型”的扩展中
类 SomeClass {
^~~~~~~~~~~~~~~~~
/.../Sample.swift:117:1: 注意:在宏“模型”的扩展中
类 SomeClass {
^~~~~~~~~~~~~~~~~
如果右键单击@Model并选择“展开宏”,您会看到:
@__swiftmacro_8Sample39SomeClass5ModelfMm_.swift:15:34: error: type 'Any?' has no member 'two'
("value", \SomeClass.value, .two, nil)
~^~~
/.../Sample.swift:117:1: note: in expansion of macro 'Model' here
class SomeClass {
^~~~~~~~~~~~~~~~~
/.../Sample.swift:117:1: note: in expansion of macro 'Model' here
class SomeClass {
^~~~~~~~~~~~~~~~~
该错误似乎来自函数内部schemaMetadata()。
有什么解决办法吗?
注意:这个答案适用于 Xcode 15 beta 和 Xcode 15 的发布版本。当然,Xcode 15 的发布版本中更新的编译器错误使得这个答案比测试期间更加明显。
事实证明,这可以通过更改行来解决:
var value: SomeEnum = .two
Run Code Online (Sandbox Code Playgroud)
到:
var value: SomeEnum = SomeEnum.two
Run Code Online (Sandbox Code Playgroud)
或者
var value = SomeEnum.two
Run Code Online (Sandbox Code Playgroud)
这两个更改中的任何一个都会导致该schemaMetadata()行更新为:
("value", \SomeClass.value, SomeEnum.two, nil)
Run Code Online (Sandbox Code Playgroud)
这让编译器很高兴。
或者您可以从属性中移动初始值并将其放入init:
var value: SomeEnum
init(value: SomeEnum = .two) {
self.value = value
}
Run Code Online (Sandbox Code Playgroud)
这似乎是 SwiftData 宏中的一个错误,在生成函数时无法正确.two扩展。SomeEnum.twoschemaMetadata()