2016-05-06 52 views
1

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

难道不是很奇怪吗?

回答

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) 
+0

您是否认为?因为它的确适用于** iPad Pro **,并且不适用于iPad 4 **。它解释了什么吗? –

+0

@BartłomiejSemańczyk:什么不适用于iPad 4,我的建议或您的代码? –

+0

我的问题代码。但是看起来'schoolClass.id'没有问题,它是** Int64 **,但是只有简单的字符串。 –

0

由于searchTextField中没有任何内容,因此您将插入nil。

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

检查文本框中的值。

希望它可以帮助..

+0

我更新了这个问题,“searchTextField.text!”的值正确吗? –