今天我遇到了一个奇怪的错误,阻碍了我的进步。我想向已经使用 SwiftData 保存数据的应用程序添加 CloudKit 支持。我读到“所有属性都必须具有默认值,或者与其初始值设定项一起标记为可选。”不幸的是,在进行这些更改后,我收到了帖子标题中提到的错误,因为我正在使用谓词来过滤列表。有谁知道如何解决这个问题,这是 SwiftData 当前的限制吗?
重现步骤:
示例:
import SwiftUI
import SwiftData
@Model
final class Example {
var category: String!
var subcategory: String!
init(category: String, subcategory: String) {
self.category = category
self.subcategory = subcategory
}
}
struct ContentView: View {
@Query private var examples: [Example]
init() {
let predicate = #Predicate<Example> { example in
example.category.contains("") || example.subcategory.contains("")
}
_examples = Query(filter: predicate)
}
var body: some View {
Text("Hello world")
}
}
@main
struct TestExampleApp: App {
var body: some Scene {
WindowGroup {
ContentView()
.modelContainer(for: Example.self)
}
}
}
如果我删除!从示例类来看,一切正常,但这样做时,我失去了对 CloudKit 兼容性的要求。
创建 SwiftData 模型类型时,您应该将属性声明为可选
var category: String?
var subcategory: String?
然后你需要将它们解开到你的谓词中
let predicate = #Predicate<Example> { example in
if let category = example.category, let subcategory = example.subcategory {
return category.contains("5") || subcategory.contains("b")
} else {
return false
}
}