2016-05-06 51 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!」的值正確嗎? –