如何通过 Enum 属性使用新的 #Predicate 宏获取

Per*_*rde 7 swift swift-data

我正在尝试使用新的#Predicate宏获取一些结果。enum当我尝试使用谓词内的属性时,就会出现问题。有谁知道这是否可以完成或者这是否是一个错误?

XCode 15 测试版 4

获取1:

let predicate = #Predicate<ModelA> { $0.type == ModelA.ModelAType.a }
Run Code Online (Sandbox Code Playgroud)

获取2:

let predicate = #Predicate<ModelA> { $0.type.rawValue == ModelA.ModelAType.a.rawValue }
Run Code Online (Sandbox Code Playgroud)

模型:

@Model final class ModelA: Codable {
    @Attribute(.unique) var id: Int64 = 0
    enum ModelAType: Int, CaseIterable, Codable { case a = 1, b }
    var type: ModelAType = ModelAType.a
}

Run Code Online (Sandbox Code Playgroud)

错误:

类型“ModelA.Type”无法符合“StandardPredicateExpression”
类型“ModelA.Type”无法符合“PredicateExpression”
无法从上下文推断关键路径类型;考虑显式指定根类型

Joa*_*son 3

从 Xcode 15.2 开始,如果您想在谓词中使用枚举,这似乎根本不起作用,解决方法是直接存储枚举的原始值,并使用计算属性在存储值和枚举之间进行转换类型。

\n
\n

在这种情况下对我有用的是为原始值定义一个常量并在谓词中使用该常量

\n
let aValue = ModelA.ModelAType.a.rawValue\nlet predicate = #Predicate<ModelA> { $0.type.rawValue == aValue }\n
Run Code Online (Sandbox Code Playgroud)\n

我不确定为什么需要这个,但希望它 \xe2\x80\x99s 是一个很快就会改变的测试版

\n

  • 似乎不适用于 XCode 15.1 beta 3 和模拟器 17.2 (2认同)