我有一个ID为Int64
的对象:
class MyObject : Object {
let id = RealmOptional<Int64>();
}
我想使用此ID过滤List
MyObject
:
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过滤我的对象?
答案 0 :(得分:4)
你想:
let object = myObjectsList.filter("id = %@", objectID ?? NSNull()).first
值得强调的是,Swift的\(someVariable)
字符串插值和NSPredicate
%@
参数替换语法不可互换。前者将变量的字符串表示形式插入到谓词字符串中,然后NSPredicate
进行解析。使用%@
将对象的引用替换为生成的NSPredicate
对象。这种差异解释了为什么您在两次尝试中看到解析谓词格式字符串的错误。
要注意的第二件事是,由于查询由NSPredicate
(Objective-C类型)表示,因此替换参数需要遵循其约定。特别是,Swift选项不能用于表示值的存在或不存在,因为Objective-C不知道选项。相反,非可选类型可以表示值的存在,NSNull
的实例表示缺少值。在上面的代码中,我使用了??
,Swift的nil coalescing运算符来实现这种映射。