首页 文章

Swift Optionals - 在解开可选值时意外地发现nil

提问于
浏览
2

我是Swift的新手,并且一直试图围绕可选值包围(ha)我的脑袋 . 据我所知 - 尽管我可能错了 - 变量可以是可选的,因此包含一个nil值,这些必须在代码中考虑 .

每当我点击我的应用程序中的“保存”按钮时,我都会收到错误:'致命错误:在展开可选值时意外发现nil' .

@IBAction func saveTapped(sender: AnyObject) {

    //code to save fillup to Parse backend

    // if variable is not nil
    if let username = PFUser.currentUser()?.username {

        // set username equal to current user
        self.object.username = username

    }else{

        println("PFUser.currentUser()?.username contained a nil value.")

    }

    // if variable is not nil
    if let amount = self.amountTextField.text {

        //set amount equal to value in amountTextField
        self.object.amount = self.amountTextField.text

    }else{

        println("self.amountTextField.text contained a nil value.")

    }

    // if variable is not nil
    if let cost = self.costTextField.text {

        // set cost equal to the value in costTextField
        self.object.cost = self.costTextField.text

    }else{

        println("self.costTextField.text contained a nil value.")

    }

    // set date equal to the current date
    self.object.date = self.date

    //save the object
    self.object.saveEventually { (success, error) -> Void in

        if error == nil {

            println("Object saved!")

        }else{

            println(error?.userInfo)

        }


    }

    // unwind back to root view controller
    self.navigationController?.popToRootViewControllerAnimated(true)

}

不确定错误是否是由于此代码块或其他地方的某些内容 - 如果需要可以提供主类代码 .

任何人都能提供的任何帮助都会非常感激,因为这一直困扰着我一段时间 .

1 回答

  • 5

    从你的代码和评论听起来你的问题肯定在于 self.object

    您的代码从不使用 if let 语句来检查以确保self.object不是nil

    使用 println(username) 是有效的,因为 username 不是零 . 但是当你试图调用 self.object.username 时,导致崩溃的是 self.object .

    您可能在实现中有一个属性,如 var object:CustomPFObject! ,这意味着,当您第一次访问此变量时,它可能想要检查您第一次设置self.object的代码,并确保它已经尝试过了's being set before you'访问它 .

    如果您在设置 self.object 时以及访问时无法管理,则将您的声明更改为 var object:CustomPFObject? 现在它将被迫做出决定 .

    例如:

    var object:CustomPFObject?
    
    let text = self.object.username //won't compile
    
    let text = self.object!.username //mighty crash
    
    let text = self.object?.username //you're safe, 'text' just ends up nil
    

    我希望这可以帮助您解决问题 .

相关问题