我的代码面临一个奇怪的错误:
if let date = self.messages.last?.date {
let newMessages = self.realm.objects(Message).filter("chatId == '\(self.chatId!)' AND date > \(date)")
}
这会输出错误:
由于未捕获的异常'NSInvalidArgumentException'而终止应用程序,原因:'无法解析格式字符串'chatId ='oSgUGWH9fWURmBh5NQZK2POpxdI3yEdl7PrPzAU33l7cVFIpzR38otF3'和日期> 2016-07-17 10:56:07 +0000“'
我做错了什么?
修改
使用NSPredicate
可行:
let predicate = NSPredicate(format: "chatId = %@ AND date > %@", self.chatId!, date)
newMessages = self.realm.objects(Message).filter(predicate)
但为什么第一种解决方案不起作用?
答案 0 :(得分:0)
如果要使用谓词过滤数组,则需要传递谓词而不仅仅是字符串文字作为参数,并使用方法filteredArrayUsingPredicate(_:)
。
为什么"chatId == '\(self.chatId!)' AND date > \(date)"
不起作用的是编译器将其解释为字符串文字 - 而不是您在其他示例中创建的谓词:
NSPredicate(format: "chatId = %@ AND date > %@", self.chatId!, date)
修复方法是在您的编辑中完成NSPredicate
实例化,并将该值传递给filteredArrayUsingPredicate(:_)
,或者只是将实例移动到方法内部:
newMessages = self.realm.objects(Message).filteredArrayUsingPredicate(NSPredicate(format: "chatId = %@ AND date > %@", self.chatId!, date))
如果你想使用这个方法,那么数组必须是NSArray
,并且数组中的对象需要符合KVC,所以你在使用{{{ 1}}方法如下:
filter(_:)