2015-06-09 8 views
20

मैंने अभी नया एक्सकोड 7.0 बीटा डाउनलोड किया है और स्विफ्ट 1.2 से स्विफ्ट 2 में माइग्रेशन किया है। प्रवासन ने स्पष्ट रूप से पूरे कोड को नहीं बदला है, वास्तव में एक विधि saveContext() था ठीक लाइन के लिए 2 त्रुटियों फेंकता है जब तक:स्विफ्ट 2 माइग्रेशन सेव कॉन्टेक्स्ट() एपडिलेगेट

if moc.hasChanges && !moc.save() { 

द्विआधारी ऑपरेटर '& &' दो बूल ऑपरेंड

और

के लिए लागू नहीं किया जा सकता 210

कॉल फेंक कर सकते हैं, लेकिन यह 'कोशिश' और त्रुटि नहीं संभाला है

विधि इस तरह दिखता है के साथ चिह्नित नहीं है:

// MARK: - Core Data Saving support 
func saveContext() { 
    if let moc = self.managedObjectContext { 
     var error: NSError? = nil 
     if moc.hasChanges && !moc.save() { 
      // Replace this implementation with code to handle the error appropriately. 
      // abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development. 
      NSLog("Unresolved error \(error), \(error!.userInfo)") 
      abort() 
     } 
    } 
} 

यह कैसे प्राप्त करने के लिए पर कोई भी विचार काम कर रहे?

उत्तर

33

आपके द्वारा प्रदान की गई दो त्रुटियों में से पहला भ्रामक है, लेकिन दूसरा स्थान है। समस्या !moc.save() में है जो स्विफ्ट 2 के रूप में, अब बूल लौटाती है और इसके बजाय throws को एनोटेट किया गया है। इसका मतलब यह है कि आपको try इस विधि और catch को किसी भी अपवाद को छोड़ना है, जो सिर्फ निकलने के बजाय गीलेर की वापसी मूल्य सही या गलत है।

इसे प्रतिबिंबित करने के लिए, कोर डेटा का उपयोग कर एक्सकोड 7 में बनाई गई एक नई परियोजना निम्न बॉयलरप्लेट कोड का उत्पादन करेगी जो आपके द्वारा उपयोग किए जा रहे कोड को प्रतिस्थापित कर सकती है।

func saveContext() { 
    if managedObjectContext.hasChanges { 
     do { 
      try managedObjectContext.save() 
     } catch { 
      // Replace this implementation with code to handle the error appropriately. 
      // abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development. 
      let nserror = error as NSError 
      NSLog("Unresolved error \(nserror), \(nserror.userInfo)") 
      abort() 
     } 
    } 
} 
+1

धन्यवाद कि सही जवाब है, इसके अलावा, आप तो रेखा की तरह लग रहा managedObjectContext के बाद एक '' जोड़ने की जरूरत:! 'ManagedObjectContext अगर .hasChanges {' और 'कोशिश managedObjectContext .save()' – kalafun

+0

@ kalafun नहीं, एक्सकोड 7 में प्रबंधित ऑब्जेक्ट कॉन्टेक्स्ट वैकल्पिक नहीं है। मेरे उत्तर – Ian

+0

पर अपडेट पोस्ट करेगा यह अजीब बात है कि मैं एक्सकोड 7 बीटा का उपयोग कर रहा हूं और गायब विस्मयादिबोधक चिह्न के कारण यह एक त्रुटि फेंक दिया। आपके अपडेट की प्रतीक्षा कर रहा है .. – kalafun

9

0x7FFFFFFF द्वारा जवाब सही है, लेकिन एप्पल के बॉयलरप्लेट कोड पर सुधार करने के लिए, आप उपयोग कर catch let error as NSError तो जैसे कैच ब्लॉक में विशिष्ट त्रुटि पकड़ कर सकते हैं:

func saveContext() { 
    if managedObjectContext.hasChanges { 
     do { 
      try managedObjectContext.save() 
     } catch let error as NSError { 

      NSLog("Unresolved error \(error), \(error.userInfo)") 
      // Handle Error 
     } 
    } 
} 

सबसे अच्छा अभ्यास का उपयोग है वर error डायन अभी भी अगर आप सिर्फ इसे इस तरह का उपयोग उपलब्ध हो जाएगा:

func saveContext() { 
     if managedObjectContext.hasChanges { 
      do { 
       try managedObjectContext.save() 
      } catch { 
       NSLog("Unresolved error \(error), \(error.userInfo)") 
       // Handle Error 
      } 
     } 
    } 

उसी तरह, यदि आप उसयकीन हैthrow एक exception, कोड नीचे करने के लिए slimmed है नहीं होगा:

func saveContext() { 
    if managedObjectContext.hasChanges { 
     try! managedObjectContext.save() 
    } 
} 

और पर एक्सट्रपलेशन क्यों managedObjectContext स्विफ्ट 2 कोड में वैकल्पिक नहीं है, यह है, क्योंकि NSManagedObject(concurrencyType:) एक प्रारंभकर्ता कि असफल नहीं करता है। एक्सकोड 6 में, NSPersistentStoreCoordinator शून्य है, लेकिन बॉयलरप्लेट कोड ने वैकल्पिक संदर्भ दिया है, लेकिन आप इसे आसानी से जांचकर आसानी से संभाल सकते हैं।

lazy var managedObjectContext: NSManagedObjectContext = { 
    let coordinator = self.persistentStoreCoordinator 
    var moc = NSManagedObjectContext(concurrencyType: .MainQueueConcurrencyType) 
    moc.persistentStoreCoordinator = coordinator 
    return moc 
}() 
संबंधित मुद्दे