swift如何查询字符串和 NSDate 属性?

标签: ios Swift
发布时间: 2017/3/6 23:36:17
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

我面临一个奇怪的错误与我的代码︰

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)

但第一个解决方案为什么不工作?

解决方法 1:

如果你想要筛选数组使用谓词,您需要一个谓词并不只是一个字符串文字将作为参数传递,还使用方法 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 兼容,所以你最好在 Swift 使用 filter(_:) 方法如︰

let newMessages = self.realm.objects(Message).filter({ $0.chatId == self.chatId! && $0.date.compare(date) == NSComparisonResult.OrderedDescending })
官方微信
官方QQ群
31647020