在展开Optional值时意外地发现了nil

时间:2015-07-29 05:54:19

标签: ios swift parse-platform

我正在尝试实施一个投票按钮,以便用户可以对帖子进行投票。类似于功能的东西。为此,我在单元格视图控制器中使用IB操作,如下所示

@IBAction func vote(sender: AnyObject) {

    if (parseObject != nil) {
        if var votes:Int? = parseObject!.objectForKey("votes") as? Int {
            votes!++

            parseObject!.setObject(votes!, forKey: "votes")
            parseObject!.saveInBackgroundWithTarget(nil, selector: nil)

            votesLabel?.text = "\(votes!) votes"
}

然后我将下面的代码放在集合视图控制器中,如果列中没有任何内容,标签将显示为0.

     if var votes:Int? = parseObject!.objectForKey("votes") as? Int {
        if votes == nil{
            votes = 0}
        cell.votesLabel?.text = "\(votes!) votes" 
    }
    return cell
}

我的代码中没有错误,但是一旦我构建应用程序,它就会在解开指向突出显示的代码的Optional值时意外地发现nil。我实施这个错误的方式了吗?谢谢。

2 个答案:

答案 0 :(得分:1)

您可以尝试使用可选链接,而不是强制解包。所以整个表达式将返回nil而不是抛出错误。

if var votes:Int? = parseObject?.objectForKey("votes") as? Int {

修改

让Swift推断出变量的类型也是一种更好的做法,所以:

if var votes = parseObject?.objectForKey("votes") as? Int {

答案 1 :(得分:0)

尝试以下代码:

@IBAction func vote(sender: AnyObject) {
if (parseObject != nil)
{
     if let votes = parseObject!.objectForKey("votes") as? Int {
         parseObject!.setObject(votes + 1, forKey: "votes")
         parseObject!.saveInBackgroundWithTarget(nil, selector: nil)
         votesLabel?.text = "\(votes + 1) votes"
     }
     else
     {
         parseObject!.setObject(1, forKey: "votes")
         parseObject!.saveInBackgroundWithTarget(nil, selector: nil)
         votesLabel?.text = "1 votes"
     }
}

在集合视图控制器

if (parseObject != nil)
{

   if let votes = parseObject!.objectForKey("votes") as? Int {
       cell.votesLabel?.text = "\(votes) votes"
   }
   else
   {
       cell.votesLabel?.text = "0 votes"
   }
}
return cell