使用 Core Data 解包 Optional 值时意外发现 nil

Posted

技术标签:

【中文标题】使用 Core Data 解包 Optional 值时意外发现 nil【英文标题】:Unexpectedly found nil while unwrapping an Optional value with Core Data 【发布时间】:2016-09-06 13:48:11 【问题描述】:

所以我一直在为 Swift 3.0 更新我的代码,当应用程序打开时,我与 iCloud 同步并执行一个获取请求。

但是我得到以下可选错误

let appDelegate = UIApplication.shared.delegate as! AppDelegate
     appDelegate.syncWithCompletion  (completed) -> Void in

在appDelegate中执行如下函数

func syncWithCompletion(_ completion:@escaping (_ completed:Bool) -> Void) 

      if !ensemble.isLeeched 
            ensemble.leechPersistentStore  error in
                if error != nil 
                    print("cannot leech \(error!.localizedDescription)")
                    completion(false)
                
                else 
                    print("leached!!")
                    completion(true)
                
            
      
      else 
            ensemble.merge error in
                if error != nil 
                    print("cannot merge \(error!.localizedDescription)")
                    completion(false)
                
                else 
                    print("merged!!")
                    completion(true)
                    //NSNotificationCenter.defaultCenter().postNotificationName("Updated-DB", object: nil)
                
           
      

我不确定可选错误是什么,Xcode 在迁移时更新了函数头。

更新:

所以显然下面的值为 nil

但我不确定自 Swift 3 迁移以来导致此问题的原因

【问题讨论】:

在 xCode 中放置 all-exertions 断点,并告诉我们您的错误到底在哪里。 @PavelGatilov 我已经更新了问题,我将仔细检查迁移时还有哪些变化 但是,它到底在哪里崩溃了? 【参考方案1】:

所以我发现错误是因为委托中的didFinishLaunchingWithOptions 函数。函数未正确迁移。

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: Any]?) -> Bool 

我创建了一个新项目并改用以下项目

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool 

它奏效了。这是因为未调用以下内容,因此未设置我的核心数据堆栈

self.setupCoreData()

【讨论】:

为什么不使用 Apple 模板中建议的(自动)惰性初始化核心数据堆栈?

以上是关于使用 Core Data 解包 Optional 值时意外发现 nil的主要内容,如果未能解决你的问题,请参考以下文章

使用 AVAudioPlayer 解包 Optional 值时意外发现 nil

解包 Optional 时,pickerView 意外发现 nil

在 Swift 中对 Optional 值进行测试后解包时出错

AVCaptureDeviceInput在解包Optional值时意外发现nil

Swift中的Optional类型 (可选类型)与强制解包 ? !

异步tcp通信——APM.Core 解包