2015-06-20 10 views
19

मुझे उस कोड के साथ कुछ समस्या मिली है जिसे मैं समझ नहीं सकता। बाद मैं Xcode 7 बीटा स्थापित किया है और स्विफ्ट के लिए अपने तेज कोड परिवर्तित 2स्विफ्ट 2 (executeFetchRequest): त्रुटि प्रबंधन

कोड:

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() 
} 

स्क्रीनशॉट:

enter image description here

उत्तर

54

स्विफ्ट 2 के रूप में, कोको तरीकों कि त्रुटियों का उत्पादन स्विफ्ट फ़ंक्शंस में किया जाता है जो त्रुटि को फेंक देते हैं।

एक वैकल्पिक वापसी मान और स्विफ्ट 1.x में के रूप में एक त्रुटि पैरामीटर के बजाय

:

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

स्विफ्ट 2 विधि अब एक गैर वैकल्पिक वापस आती है और में एक त्रुटि फेंकता त्रुटि के मामले में, जो कोशिश पकड़ साथ संभाला जाना चाहिए:

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

अधिक जानकारी के लिए "Adopting Cocoa Design Patterns"में "त्रुटि हैंडलिंग" देख "Using Swift with Cocoa and Objective-C" दस्तावेज में।

+2

और आप कस्टम मानों से भरा एक सरणी का उपयोग करने की कोशिश कर रहे हैं, तो आपके लाने लाइन इस तरह दिखेगा ... 'विचारों = self.managedObjectContext कोशिश करो! .executeFetchRequest (fetchRequest) के रूप में! [विचार] ' – justColbs

+0

यदि मेरे पास केवल 'सूची' का उदाहरण है और इसके लिए कोई सरणी नहीं है, तो मैं ऐसा कैसे करूं? – jo3birdtalk

+0

@ jo3birdtalk: executeFetchRequest() हमेशा एक सरणी देता है। यदि केवल एक उदाहरण है तो आप इसे एक्सेस कर सकते हैं उदा। 'सूची [0]' या 'list.first' के माध्यम से। –

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

हाय, अगर मेरे पास 'YourEntity' की सरणी नहीं है लेकिन केवल इसका एक उदाहरण है, तो मैं ऐसा कैसे करता हूं? मैंने ब्रेसिज़ के बिना कोशिश की, यह मुझे संकेत देता है कि 'उपयोगकर्ता' – jo3birdtalk

+0

@ jo3birdtalk टाइप करने के लिए AnyObject को परिवर्तित नहीं कर सकता है बस myResult = results?। First। यदि आप जानते हैं कि आपके fetch अनुरोध को केवल एक ऑब्जेक्ट वापस करना चाहिए, तो आप इसे प्राप्त कर सकते हैं। – Macondo2Seattle

4

आप इस कोड की कोशिश कर सकते:

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

नीचे

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

सामान्य रूप से मैं आपको पोस्ट करने वाले किसी भी कोड के अतिरिक्त एक संक्षिप्त विवरण जोड़ने की सलाह दूंगा। (इसलिए, उदाहरण के लिए, यदि कोई टाइपो होगा, या यदि लोग सीधे प्रयास करने के लिए अवसर में नहीं हैं, तो लोग अभी भी आसानी से बिंदु प्राप्त कर सकते हैं)। –

3

स्विफ्ट 3.0 कोड का प्रयास करें इस उदाहरण PlayerList है NSManagedObject इकाई/वर्ग के नाम में (एक्सकोड द्वारा स्वतः बनाया गया)

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)") 
संबंधित मुद्दे