SwiftData/CloudKit - 谓词不支持具有多个组件的键路径

问题描述 投票:0回答:1

今天我遇到了一个奇怪的错误,阻碍了我的进步。我想向已经使用 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 兼容性的要求。

swift swiftui cloudkit swiftdata
1个回答
0
投票

创建 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
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.