具有默认值的枚举属性上的 SwiftData 编译器错误

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()

有什么解决办法吗?

Han*_*ash 6

注意:这个答案适用于 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()