2016-08-22 6 views
-1

私は、ユーザーがメッセージをタップするたびに1によってFirebase変数のスコアをインクリメントすることになっているコードのこの部分を持っている:私はラインでエラーNo '+' candidates produce the expected contextual result type 'AnyObject?'を取得していますが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) 
     } 
    } 

currentData.value = currentData.value + 1 

私は理解できません。

誰が私は素晴らしいだろう、このタイプのエラーを修正するのに役立つことができれば

(それはBinary operator '+' cannot be applied to operands of type 'AnyObject?' and 'Int'を言います)私はそのようなcurrentData.value = currentData.value + 1 as! IntなどcurrentData.value as! Int = currentData.value + 1として整数としてキャストしようとしたが、スウィフトは、それはしていません!

答えて

2

はcurrentData.valueはあなたが取得しているデータ値は、多くの種類のいずれかになりますのInt

+0

を私はあなたのコードを試してみましたが、それは誤りで私のプログラムがクラッシュ: '型の値をキャストすることができませんでした「nsnullを」(0x19fe50bc0「)のNSNumber」(0x19fe5b900).' –

+0

にしてくださいあなたの価値はいくつかの価値を持っているかどうかチェックする前に? NSNumber/Int/NSIntegerを持っているのはどんな種類の価値があるのでしょうか? –

+0

あなたのデータ型を教えてください –

0

としてそれをキャストする必要がありますタイプオプションANYOBJECTであるとして、Firebaseが設定をサポート

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

を試してみてくださいこれをNSNumber、String、Dictionary、Arrayなどに変換します(https://firebase.google.com/docs/reference/ios/firebasedatabase/interface_f_i_r_mutable_data

逆に値を取得すると、NSNumberにキャストしてintValueを取得することで、Swiftが特定の型を理解するのを助ける必要があります。あなたは値が常にするNSNumberになることを確信している場合は、あなたが行うことができるはず「+」

のような操作を行うことが一般的すぎるとANYOBJECT:

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

そうでなければ、あなたが型の第1および行為をチェックする必要がありますそれに応じて。

あなたは運動場でこのコードを配置する場合、それは期待した結果、6生成:currentData.valueはまだ未知のタイプを持っているので、あなたは、intとして「1」キャスト

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

あなたのコードを推奨コードに置き換え、次のエラーが表示されました: 'No '+'候補は予想されるコンテキスト結果の型 'AnyObject?'を生成します。 –

+0

あなたは別のもの私はちょうど遊び場で試してみました。うーん。私は私のプレイグラウンドコードで私の答えを更新します。 –

+0

何らかの理由で、それは私に上記のエラーを与えている... –

1

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

をここで

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でデータを更新しません。設定データは後続の行で発生するはずです: 'return FIRTransactionResult.successWithValue(currentData)'は動作しません。myValueでcurrentDataを置き換えようとしましたが、範囲外であるため、Swiftは認識しません。 –

+0

ifをifの内側に投げることができます。これを反映するようにコードを更新しました。あなたは –

+0

Hmですが、elseケースを処理することを確認してください。それは 'FIRTransactionResult 'を返すと予想されていた閉鎖の戻り値がありませんでしたので、' else { return FIRTransactionResult.successWithValue(currentData) } 'というコードを追加しましたが、それでも動作しましたがFirebaseで更新されませんでした... –

関連する問題