gpt4 book ai didi

swift - Realm 过滤器不以 Int64 作为参数

转载 作者:可可西里 更新时间:2023-11-01 00:50:31 24 4
gpt4 key购买 nike

我有一个 ID 为 Int64 的对象:

class MyObject : Object {
let id = RealmOptional<Int64>();
}

我想使用此 ID 过滤 MyObjectList:

let objectID = myObject.id.value;
let object = myObjectsList.filter("id = \(objectID)").first; // crash

应用程序因错误而崩溃:

'Invalid value', reason: 'Expected object of type int for property 'id' on object of type 'MyObject', but received: Optional(2)'

当我改为:

let object = myObjectsList.filter("id = \(myObject.id.value)").first; // crash

错误是:

'NSInvalidArgumentException', reason: 'unable to parse function name 'Optional:' into supported selector (Optional:)'

当我这样做时:

let object = myObjectsList.filter("id = \(myObject.id)").first; // crash

错误是:

'NSInvalidArgumentException', reason: 'unable to parse the format string "id = RealmSwift.RealmOptional<Swift.Int64>"'

那么我应该如何使用对象 ID 来过滤我的对象?

最佳答案

你想要:

let object = myObjectsList.filter("id = %@", objectID ?? NSNull()).first

值得强调的是,Swift 的 \(someVariable) 字符串插值和 NSPredicate%@ 参数替换语法不是 可互换。前者将变量的字符串表示形式插入到谓词字符串中,NSPredicate 然后对其进行解析。使用 %@ 将对象的引用替换为生成的 NSPredicate 对象。这种差异解释了为什么您在两次尝试中看到解析谓词格式字符串的错误。

要注意的第二件事是,由于查询由 NSPredicate(一种 Objective-C 类型)表示,因此替换的参数需要遵循其约定。特别是,Swift 可选值不能用于表示值的存在或不存在,因为 Objective-C 不知道可选值。相反,非可选类型可以表示值的存在,而 NSNull 的实例表示值不存在。在上面的代码中,我使用了 Swift 的 nil 合并运算符 ?? 来实现此映射。

关于swift - Realm 过滤器不以 Int64 作为参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39925319/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com