【问题标题】:"Thread 1: Fatal error: Unexpectedly found nil while implicitly unwrapping an Optional value"“线程 1:致命错误:在隐式展开可选值时意外发现 nil”
【发布时间】:2020-08-10 00:36:38
【问题描述】:

我正在开发一个 Swift 项目,但一直收到此错误:“线程 1:致命错误:在隐式展开可选值时意外发现 nil”:

func addPicture(pic: Picture!){
    pictureArray.append(pic)
}

(注意:我已经尝试过 pic: Picture 和 pic: Picture! 两种方式都出现相同的错误)

pictureArray 是这样定义的:

    var pictureArray: [Picture]!

我在尝试保存图片并弹出当前 VC 时收到此错误:

@objc func dismissViewControllerAndSave() {
    let picture = Picture(name: "NewPic", preview: "newpic", colorDictionary: [:], blueprint: [])
    let viewController = ViewController()
    viewController.addPicture(pic: picture)
    self.navigationController?.popViewController(animated: true)
}

我一直在努力解决这个问题很长时间,但我不知道如何解决它。 picture 不是可选值,所以我不知道为什么我不断收到此错误。我真的很感激我能得到的任何帮助。谢谢!

【问题讨论】:

  • 像var pictureArray: [Picture] = [Picture]() 那样更改图片数组,因为第一次调用它时它是 nil 并且使用 ! 你不能检查它上面的 nils
  • 我不认为这是一个完全相同的副本(虽然我怀疑有一个,但到目前为止我还没有找到它),但你也应该阅读stackoverflow.com/questions/32170456/…

标签: swift


【解决方案1】:

! 类型是隐式展开的可选 (IUO)。这意味着该值在技术上是可选的,但如果它是 nil 则读取它是一个编程错误。

通常,您不需要 IUO。在一些特殊情况下,它们会围绕初始化顺序出现,并且它们曾经是处理未注释的 Objective-C 桥接所必需的。但大多数时候你不需要它们,而且你绝对不需要传递 Picture! 作为参数(我想不出任何有意义的情况)。

删除!。

func addPicture(pic: Picture){
    pictureArray.append(pic)
}

var pictureArray: [Picture]

执行此操作时,您可能会收到 pictureArray 未初始化的错误。那挺好的。这个错误告诉你你在哪里犯了错误。在这种情况下,您可能只想在定义它时对其进行初始化:

var pictureArray: [Picture] = []

你也可以在init中初始化它。

有关 IUO 的更多信息,请参阅 Swift Programming Language 中的“隐式解包选项”。对于它们实际有用的常见极端情况,请参阅Unowned References and Implicitly Unwrapped Optional Properties。

【讨论】:

    猜你喜欢
    • 2021-01-05
    • 1970-01-01
    • 2020-11-01
    • 2020-09-03
    • 2020-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多