2016-08-22 71 views
-1

我有这样一段代码是应该由一个每当用户点击的消息递增一个火力地堡变量的得分:Swift:二元运算符'+'不能应用于'AnyObject'类型的操作数吗?和“INT”

override func collectionView(collectionView: JSQMessagesCollectionView!, didTapMessageBubbleAtIndexPath indexPath: NSIndexPath!) { 

    super.collectionView(collectionView, didTapMessageBubbleAtIndexPath: indexPath) 
    let data = self.messages[indexPath.row] 

    print("They tapped: " + (data.text) + "- " + (data.senderDisplayName)) 

    rootRef.child("messages").child(data.senderId).child("score").runTransactionBlock({ (currentData: FIRMutableData) -> FIRTransactionResult in 
     // Set value and report transaction success 
     currentData.value = currentData.value + 1 
     return FIRTransactionResult.successWithValue(currentData) 
    }) { (error, committed, snapshot) in 
     if let error = error { 
      print(error.localizedDescription) 
     } 
    } 

但是我在该行得到错误No '+' candidates produce the expected contextual result type 'AnyObject?'

currentData.value = currentData.value + 1 

由于某种原因,我无法弄清楚。

我试图铸造作为一个整数这样currentData.value = currentData.value + 1 as! Int以及currentData.value as! Int = currentData.value + 1但斯威夫特没有它(它说:Binary operator '+' cannot be applied to operands of type 'AnyObject?' and 'Int'

如果有人可以帮助我解决这种类型的错误,那将是非常美妙!

回答

2

尝试

currentData.value = currentData.value as! Int + 1 

为currentData.value是类型可选AnyObject的,你必须将它转换为INT

+0

我想你的代码,但它坠毁我的程序出现错误:'无法投类型的值“NSNull”(0x19fe50bc0)到“的NSNumber”(0x19fe5b900).' –

+0

请如果你的价值是否有价值,那么在它之前的一张支票? ,如果它具有什么样的价值是有NSNumber/Int/NSInteger? –

+0

请让我知道您的数据类型 –

0

您检索可能是多种类型之一的数据值,火力地堡支持设置这一个的NSNumber,字符串,字典,数组等等(见https://firebase.google.com/docs/reference/ios/firebasedatabase/interface_f_i_r_mutable_data

相反,当你的价值,你需要帮助斯威夫特理解它是由它铸造的NSNumber,并从获得的intValue什么具体类型。 AnyObject到太一般化,不喜欢“+”

操作如果您确信该值将始终是一个NSNumber,你应该能够做到:

currentData.value = (currentData.value as! NSNumber).intValue + 1 

否则,你应该检查型的第一和行为因此。

如果在操场上把这段代码,它产生了预期的结果,6:

import Foundation 
let myValue: AnyObject? = NSNumber(value: 5) 
let addIt = (myValue as! NSNumber).intValue + 1 
print("\(addIt)") 
+0

我用您推荐的代码替换了我的代码,并得到以下错误显示:'否'+'候选人产生预期的上下文结果类型'AnyObject?' –

+0

您必须有其他东西上,我只是在操场上试过,而且运作良好。嗯。我会用我的Playground代码更新我的答案。 –

+0

由于某种原因,它给了我上述错误... –

1

currentData.value = currentData.value + 1 as! Int

在这里,你投“1”作为一个int,所以currentData.value仍然有一个未知类型

currentData.value as! Int = currentData.value + 1

这里你投你作为一个int分配数据的变量,但您要添加到1的东西还是有一个未知类型

尝试了这一点:

if let myValue = currentData.value as? Int{ 
    currentData.value = myValue + 1 
    return FIRTransactionResult.successWithValue(currentData) 
} 
+0

谢谢,这项工作可行,但不会使用Firebase更新数据。设置数据应该发生在随后的行:'返回FIRTransactionResult.successWithValue(currentData)'但是,这是行不通的...我试图用myValue替换currentData但Swift不能识别它,因为它超出了范围。 –

+0

你可以在if里面抛出return。我更新了代码以反映这一点。确保你处理其他情况,但 –

+0

嗯。它表示'在预期返回的闭包中丢失返回'FIRTransactionResult'',所以我添加了代码'else {return {FIRTransactionResult.successWithValue(currentData) }'并且它仍然有效,但仍未使用Firebase更新... –

相关问题