2017-05-29 8 views
1

いくつかのオブジェクトを返すCloud Code関数がありますが、そのうちのいくつかはブーリアンです。下記のように返されたオブジェクトのブール値に基づいてSwiftコードで何かしたいと思います。しかし、実装では複数のエラーが発生しています。SwiftのCloud Codeからbooleanを返す方法

クラウドコード

Parse.Cloud.define("checkCharge", function(request, response){ 
    stripe.charges.retrieve(request.params.charge, function(err, charge) { 
     if(err){ 
       console.log(err); 
       response.error(err); 
     }else{ 
       console.log("Successfully checked the charge"); 
       response.success(charge); 
     } 
}); 
}); 

スウィフトコード

PFCloud.callFunctionInBackground("checkCharge", withParameters: ["charge": orderCharge]) { (success: AnyObject?, error: NSError?) -> Void in 
//       if let responseJSON: [String: Bool] = success as? [String: Bool] { 
          if error == nil{ 
//        let responseString = response as? String 
//        let chargeCaptured: Bool = success["captured"] 
           let objects = success as! NSArray 
           for object in objects { 
           let chargeCaptured = object["captured"] as! Bool 
           let chargeRefunded: Bool = success["refunded"] 
           let chargePaid: Bool = success["paid"] 
           if chargeCaptured == true || chargeRefunded == true || chargePaid == true{ 
            print("charge already processed charge") 
            object.deleteInBackground() 
           }else{ 
            self.storyboard 
} 

私は、このような添字のあいまいな使用などのエラーを取得し、私は定数を設定しようとするたび、ANYOBJECTは何の添字のメンバーを持っていないタイプ。私はまた、BoolをBoolに変換することはできません。

+0

どのコード行がエラーをスローします。これは、オブジェクトがAnyObject型であり、呼び出すメソッドを含んでいないことを意味します。希望のタイプにキャストする必要があるかもしれません。 let文の場合に使用 – user1046037

+0

@ user1046037ありがとう。私は '' charge catched''、 '' charge refunded''、 '' charge charge ''という行にエラーを表示します。 – Dups

+0

これらのオブジェクトをBoolにキャストします。 'as'演算子を使います。あなたはSwiftに精通していますか?もしそうなら、あなたが100%確実でない限り、unwrapオプションを強制しないでください。 – user1046037

答えて

1

でコードをフォーマットするショートカットそれは、クラウドコードはNSDictionaryのような値を返さ判明しました。これが私がスウィフトでやったことです。

PFCloud.callFunctionInBackground("checkCharge", withParameters: ["charge": orderCharge]) { (success: AnyObject?, error: NSError?) -> Void in 
    if error == nil{ 
     let objects2 = success as! NSDictionary 
     let chargeCaptured = objects2.objectForKey("captured") as! Bool 
     let chargeRefunded = objects2.objectForKey("refunded") as! Bool 
     let chargePaid = objects2.objectForKey("paid") as! Bool 
    } 
} 
+0

'as 'を使うときは注意が必要です。アンラッピングを強制しているので、値がnilの場合、アプリケーションはクラッシュします。 'as? 'を使うのが良いでしょう。 – user1046037

+0

@ user1046037私は理解していますが、その結果は「オプション(真)」になりませんか? – Dups

+0

これは正しいですが、サーバから返された値もnilである可能性があるため、Optionalを返します。ですから 'if let'文を使って値があるかどうかを確認し、その中にコードを記述してください。 – user1046037

1

問題:

  • あなたは辞書のようにそれを使用しようとしていたNSArrayに鋳造後。

コード:これはあなたのための問題を修正した場合

を参照してください:

PFCloud.callFunctionInBackground("checkCharge", withParameters: ["charge": orderCharge]) { data, error in 

    //If there is an error, code will not proceed, it will exit 
    guard error == nil else { 
     print("error = \(error!)") 
     return 
    } 

    //If data is not a dictionary of the type [String : Any] it will exit 
    guard let objects = data as? [String : Any] else { 
     print("data is not of the type [String : Any]") 
     print("actual data type of data = \(type(of: data))") 
     return 
    } 

    if let chargeCaptured = objects["captured"] as? Bool, 
     let chargeRefunded = objects["refunded"] as? Bool, 
     let chargePaid  = objects["paid"] as? Bool, 
     chargeCaptured  == true || chargeRefunded == true || chargePaid == true { 

     print("charge already processed charge") 
     object.deleteInBackground() 
    } 
    else { 

     print("Else condition") 
    } 
} 

提案:

  • 使用guard
  • 史上可能スウィフトネイティブ型を使用してください、 if letオプションで条件付きでラップを解除する
  • スウィフトの基本を学ぶと助けになります。
  • 使用コントロール+私はXcodeの
+0

としてchargeCaptured =オブジェクト["取り込み済み"]ありがとうございます。私はデータが辞書型であると思った。スタックオーバーフローをチェックする前に解決したので、私はあなたのソリューションを使用しませんでしたが、私はあなたが働くことができるものを置くことがわかります。 – Dups

関連する問題