NSPredicate格式中第二个参数的“无效谓词:无RHS”

这是我的NSPredicate

 print(searchTextField.text!) let predicate = NSPredicate(format: "student.schoolClass.id = %d AND (book.title CONTAINS[cd] %@ OR student.username CONTAINS[cd] %@)", currentSchoolClass.id, searchTextField.text!, searchTextField.text!) 

接下来我要做的是:

 fetchedResultsController.fetchRequest.predicate = predicate print(fetchedResultsController.fetchRequest.predicate!) try! fetchedResultsController.performFetch() //here is the crash 

控制台输出是:

 j student.schoolClass.id == 1 AND (book.title CONTAINS[cd] nil OR student.username CONTAINS[cd] "j") 

和崩溃信息是:

 CRASH: Invalid predicate: nil RHS 

这不是很奇怪吗?

在当前的所有iOS和OS X平台上,C int是一个32位整数,这就是%d格式在variables参数列表中所期望的。 如果你传递一个64位整数,那么读取下一个variables参数将读取额外的4个零字节。

下表显示了哪种格式适用于哪种整数types:

  格式CtypesSwifttypes
   -----------------------------------
   %d int Int32
   %ld long int Int
   %lld long long int Int64

对于无符号types也是如此。

或者,将整数转换为NSNumber对象并使用%@格式,这适用于所有大小的整数。 例:

 let value = 1234 let predicate = NSPredicate(format: "value = %@", value as NSNumber) 

你插入零,因为searchTextField没有任何东西。

所以只有在谓词中才会显示为零。

检查文本框中的值。

希望能帮助到你..