2015-06-20 35 views
19

Anlayamadığım kodla ilgili bir sorunum var. Ben Xcode 7 beta yüklü ve 2Swift 2 (executeFetchRequest): hata işleme

Kod Swift benim hızlı kodunu dönüştürmek sonra:

override func viewDidAppear(animated: Bool) { 

    let appDelegate: AppDelegate = UIApplication.sharedApplication().delegate as! AppDelegate 

    let context: NSManagedObjectContext = AppDel.managedObjectContext 
    let request = NSFetchRequest(entityName: "PlayerList") 

    list = Context.executeFetchRequest(request) 

    tableView.reloadData() 
} 

ScreenShot: Swift 2 itibarıyla

enter image description here

cevap

54

, Kakao yöntemleri o hata üretmek, bir hata attıran Swift işlevlerine çevrilir. Bunun yerine, isteğe bağlı bir geri dönüş değeri ve Swift 1.x olduğu gibi bir hata parametresinin

:

var error : NSError? 
if let result = context.executeFetchRequest(request, error: &error) { 
    // success ... 
    list = result 
} else { 
    // failure 
    println("Fetch failed: \(error!.localizedDescription)") 
} 

Swift 2 yöntemi şimdi isteğe bağlı olmayan bir döner ve bir hata atar try-catch ile ele alınması gerekir hata kılıfı,:

fazla bilgi için
do { 
    list = try context.executeFetchRequest(request) 
    // success ... 
} catch let error as NSError { 
    // failure 
    print("Fetch failed: \(error.localizedDescription)") 
} 

, "Adopting Cocoa Design Patterns"yılında "hata İşleme" bölümüne bakın "Using Swift with Cocoa and Objective-C" belgelerinde.

+2

Ve özel değerler ile dolu bir dizi kullanmaya çalışıyorsanız, sizin gibi görünecektir çizgi getir ... 'fikirler = self.managedObjectContext deneyin! Olarak (fetchRequest) .executeFetchRequest! [Fikirler] ' – justColbs

+0

Sadece bir liste var ve bunun için bir dizi değil, nasıl yaparım? – jo3birdtalk

+0

@ jo3birdtalk: executeFetchRequest() her zaman bir dizi döndürür. Yalnızca bir örnek varsa, ona erişebilirsiniz, ör. 'list [0]' veya 'list.first' üzerinden. –

1
var results = [YourEntity]? 
results = try! self.managedObjectContext!.executeFetchRequest(fetchRequest) as! [YourEntity] 
+0

Merhaba, Eğer bir 'YourEntity 'dizisi yok, ancak bunun sadece bir örneği varsa, nasıl yaparım? Parantez olmadan denedim, AnyObject 'Kullanıcı' – jo3birdtalk

+0

@ jo3birdtalk yazamazsınız bana sormaya devam ediyor Sadece izin myResult = results? .first. Getirme isteğinizin yalnızca bir nesneyi döndürmesi gerektiğini biliyorsanız, bunu nasıl sağlayabilirsiniz. – Macondo2Seattle

4

Bu kodu deneyebilirsiniz:

let result = (try! self.manageContext.executeFetchRequest(FetchRequest)) as! [NSManageObjectClass] 
1

Bu örnekte PlayerList olduğunu NSManagedObject varlık/sınıf adı ise Swift

override func viewWillAppear(animated: Bool) { 

     let appDel:AppDelegate = (UIApplication.sharedApplication().delegate as! AppDelegate) 
     let context = appDel.managedObjectContext 
     let request = NSFetchRequest(entityName:"Users") 
     do { 
      let results = try context.executeFetchRequest(request) 

      itemList = results as! [NSManagedObject] 


     } catch let error as NSError { 
      print("Could not fetch \(error), \(error.userInfo)") 
     } 


    } 
+0

Genel olarak, gönderdiğiniz herhangi bir koda ek olarak kısa bir açıklama eklemenizi tavsiye ederim. (Örneğin, eğer bir yazım hatası varsa ya da insanlar doğrudan bunu denemek için fırsatta değilse, insanlar bu noktayı yine de kolayca alabilirler). –

3

3.0 aşağıdaki kodu deneyin (Xcode tarafından otomatik olarak oluşturuldu)

let request: NSFetchRequest<PlayerList> = PlayerList.fetchRequest() 

var result:[PlayerList]? 
do{ 
     //Succes 
     result = try context.fetch(request) 
    }catch let error as NSError { 
     //Error 
     print("Error \(error)") 
    } 

print("result: \(result)")