【问题标题】:Swift 2 - Array - unexpectedly found nil while unwrapping an Optional valueSwift 2 - 数组 - 在展开可选值时意外发现 nil
【发布时间】:2015-11-04 21:28:17
【问题描述】:

如果数组为空,如何防止我的应用崩溃?

var UserVideosInfo = [[String]]()

@IBAction func actionBtn(sender: UIButton) {
userVideoInfo = NSUserDefaults.standardUserDefaults().objectForKey("UserVideos") as! [[String]]
}

如果数组为空userVideosInfo 崩溃说:

致命错误:在展开可选值时意外发现 nil

我试过了:

if var userVideoInfoArray:[[String]] = UserVideosInfo {

            userVideoInfoArray = NSUserDefaults.standardUserDefaults().objectForKey("UserVideosJSON") as! [[String]]
        }

【问题讨论】:

  • 用作?而不是作为!看来数组不是空的,数组是nil
  • 我不能,Xcode 将其标记为错误:did you mean to use '!' or'?"?
  • 是的,如果我使用as? Xcode 失败

标签: arrays swift2


【解决方案1】:

这个问题似乎与 NSUserDefault 有关。

当您尝试使用键“UserVideos”检索对象时,NSUserDefaults 可能返回 nil。然后它被显式解包到一个数组中,这会导致程序崩溃。

在继续之前,请先验证 userVideoInfo 的存在。

var UserVideosInfo: [[String]]?

@IBAction func actionBtn(sender: UIButton) {
    userVideoInfoOrNil = NSUserDefaults.standardUserDefaults().objectForKey("UserVideos")

    if userVideoInfo = userVideoInfoOrNil as! [[String]] {
        //Do stuff with userVideoInfo
    } else {
        //Value is nil
    }
}

【讨论】:

  • 它无法说出Value of type [[String]] can never be nil,
【解决方案2】:

您可以按照 Apple 的建议注册键/值对来防止它发生。

在 AppDelegate 中尽快添加

let defaults = NSUserDefaults.standardUserDefaults()
let defaultValues = ["UserVideos" : [[String]]()]
defaults.registerDefaults(defaultValues)

好处是UserVideos永远不能是nil,然后你就可以放心地写了

userVideoInfoArray = NSUserDefaults.standardUserDefaults().objectForKey("UserVideos") as! [[String]]

请阅读documentation中关于注册默认值的部分

【讨论】:

    【解决方案3】:

    如果我使用应用程序下方的代码,它不会崩溃

        if self.Videos.count >0{
    Videos = (NSUserDefaults.standardUserDefaults().objectForKey("Videos") as! [[String]])
                }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-09-22
      • 2015-10-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多