"无效的谓词:nil RHS" NSPredicate格式的第二个参数

时间:2016-05-06 13:00:07

标签: ios swift nspredicate

这是我的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

难道不奇怪吗?

2 个答案:

答案 0 :(得分:6)

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

下表显示了哪种格式为整数类型:

  Format   C type          Swift type
  -----------------------------------
  %d       int             Int32
  %ld      long int        Int
  %lld     long long int   Int64

,类似于无符号类型。

或者,将整数转换为NSNumber对象并使用 %@格式,这是有效的 适用于各种规模的整数。例如:

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

答案 1 :(得分:0)

您正在插入nil,因为searchTextField中没有任何内容。

所以只有它在谓词中显示为nil。

检查文本字段中的值。

希望有所帮助......