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

Swift2 致命错误:在Swift 2中展开可选值时意外发现nil,swift2,Swift2,我的应用程序在模拟器上运行良好,但在iPhone设备上运行时会因此消息而崩溃。为什么以及如何修复它? 我如何找到应用程序崩溃的代码行 func playButton(playButton: UIButton!) { var image = UIImage() if activePlayer == 1 { image = UIImage(named: "x.png")! } else { image = UIImage(named: "o.png")! }

我的应用程序在模拟器上运行良好,但在iPhone设备上运行时会因此消息而崩溃。为什么以及如何修复它? 我如何找到应用程序崩溃的代码行

func playButton(playButton: UIButton!) {

    var image = UIImage()

    if activePlayer == 1 { image = UIImage(named: "x.png")! }
        else { image = UIImage(named: "o.png")! }

    playButton.setImage(image, forState: .Normal)

}
在这里,我们将使用如果让我们看看下面

func playButton(playButton: UIButton!) {

var image = UIImage()

if let player =  activePlayer {
  if player == 1 {
     image = UIImage(named: "x.png")! }
}else{image=UIImage(名为:“o.png”)!}

}


(或者)如果您使用的是Swift 2.0和Xcode 7,那么guard也是一个不错的选择。

在您展示的代码中,它可能产生此错误的部分可能是强制展开的UIImage。按如下方式修改代码以了解:

func playButton(playButton: UIButton!) {
    let imageName: String
    if activePlayer == 1 {
        imageName = "x.png"
    } else {
        imageName = "o.png"
    }
    if let image = UIImage(named: imageName) {
        playButton.setImage(image, forState: .Normal)
    } else {
        print("error while retrieving image named '\(imageName)'")
    }
}

IOS设备区分大小写,而模拟器不区分大小写。因此,我将图像名称替换为确切的文件名(“X.png”和“O.png”,而不是“X.png”和“O.png”)。现在,UIImage(名为:“X.png”)不是零,应用程序运行良好。

如果没有看到您的代码,我们就无法知道出了什么问题。//一般来说,我的解决方案是转换使用
完成的每个强制展开
要使用
安全地展开,请使用
如果让
保护
,处理
中可能出现的错误,否则
子句和/或
尝试catch
机制,然后您将立即看到问题所在和错误所在。您可以在应用程序崩溃的位置发布代码吗?错误在if行:if activePlayer==1{image=UIImage(名为:“x.png”)!}我尝试了Eric的代码。该应用程序在模拟器上运行正常,但在iPhone设备上打印运行它的消息。我尝试了Eric的代码。该应用程序在模拟器上运行正常,但在iPhone设备上打印运行它的消息:“检索名为“x.png”的图像时出错”。这意味着UIImage(名为:imageName)nil是否在设备上运行,image是否在模拟器上运行!!?应用程序的其余部分在这两种环境下都运行良好。有什么不同以及如何解决它?问题不在于activePlayer。它的值不是零。应用程序在{image=UIImage(名为:“o.png”)!}行上崩溃。出于某种原因,UIImage(名为:“o.png”)!在设备上运行时为零,在模拟器上运行时不为零。
func playButton(playButton: UIButton!) {
    let imageName: String
    if activePlayer == 1 {
        imageName = "x.png"
    } else {
        imageName = "o.png"
    }
    if let image = UIImage(named: imageName) {
        playButton.setImage(image, forState: .Normal)
    } else {
        print("error while retrieving image named '\(imageName)'")
    }
}