2015-02-20 14 views
7

Tôi đang cố gắng sử dụng NSPredicate trong Swift để truy vấn dữ liệu lõi nhưng nó ném lỗi EXC_BAD_ACCESS (Code = 1, address = 0x1) khi cố gắng chạy nó, tôi đang làm gì sai?Swift NSPredicate ném EXC_BAD_ACCESS (Code = 1, address = 0x1) khi kết hợp câu lệnh

Đây là tập tin mà các lỗi xảy ra

class LevelsScreenModel : UIViewController { 

func getWord(level: Int, section: Int) -> String 
{ 
    let fetchRequest = NSFetchRequest(entityName: "Words") 

    //This is the line where the error happens 
    fetchRequest.predicate = NSPredicate(format: "level = %@", level) 
    fetchRequest.predicate = NSPredicate(format: "section = %@", section) 

    let word = AppDelegate().managedObjectContext!.executeFetchRequest(fetchRequest, error: nil) as [Words] 

    if(word.count > 1) 
    { 
     for words in word 
     { 
      println(words.word) 
      return words.word 
     } 
    } 

    return "ERROR" 
    } 
} 
+0

Lỗi cuối cùng là do không thể thực hiện "AppDelegate()". để truy cập managedObjectContext. Thay vào đó mã này làm việc cho tôi "var appDel: AppDelegate = (UIApplication.sharedApplication(). Delegate as AppDelegate)" Hy vọng điều này sẽ giúp bất cứ ai – Cesarg219

Trả lời

30

Các %@ giữ chỗ trong chuỗi định dạng vị là dành cho Objective-C đối tượng, vì vậy bạn phải quấn số nguyên vào một NSNumber:

fetchRequest.predicate = NSPredicate(format: "level = %@", NSNumber(integer: level)) 

hoặc sử dụng ld thay vì định dạng số nguyên (dài):

fetchRequest.predicate = NSPredicate(format: "level = %ld", level) 

Cũng lưu ý rằng

fetchRequest.predicate = NSPredicate(format: ...) 
fetchRequest.predicate = NSPredicate(format: ...) 

không không tạo một vị hợp chất, phân giây đơn giản ghi đè đầu tiên. Bạn có thể sử dụng một NSCompoundPredicate:

let p1 = NSPredicate(format: "level = %ld", level)! 
let p2 = NSPredicate(format: "section = %ld", section)! 
fetchRequest.predicate = NSCompoundPredicate.andPredicateWithSubpredicates([p1, p2]) 

hoặc đơn giản là kết hợp các vị từ với "VÀ":

fetchRequest.predicate = NSPredicate(format: "level = %ld AND section = %ld", level, section) 
0

Thay vì nhặng xị xung quanh với chuyển đổi định dạng và AND subpredicates, bạn có thể sử dụng PredicatePal khuôn khổ:

fetchRequest.predicate = *(Key("level") == level && Key("section") == section) 

Lưu ý rằng bạn cần phải sử dụng == thay vì = để bình đẳng so sánh.

+2

Và đây là vấn đề với việc dựa vào mã bên thứ 3, PredicatePal đã không được cập nhật trong hơn một năm –

Các vấn đề liên quan