【问题标题】:How to return boolean from Cloud Code in Swift如何从 Swift 中的云代码返回布尔值
【发布时间】:2017-10-29 05:29:02
【问题描述】:

我有一个返回多个对象的云代码函数,其中一些是布尔值。我想根据返回对象的布尔值在我的 Swift 代码中做一些事情,如下所示。但是,我在实施过程中不断遇到多个错误。

云代码

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);
        }
}); 
});

Swift 代码

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。

【问题讨论】:

  • 哪行代码会抛出该错误。这意味着 object 是 AnyObject 类型,并且不包含您尝试调用的方法。您可能需要将其转换为所需的类型。使用 if let 语句
  • @user1046037 谢谢。我在let chargeCapturedlet chargeRefundedlet chargePaid 行上遇到错误。
  • 将这些对象投射到 Bool。使用as 运算符。你熟悉斯威夫特吗?如果是,那么请不要强制打开选项,除非您 100% 确定
  • @user1046037 这样吗? ` 让对象 = 成功为! NSArray for object in objects { let chargeCaptured = object["captured"] as Bool`

标签: ios swift parse-platform stripe-payments parse-cloud-code


【解决方案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")
    }
}

建议:

  • 请尽可能使用 Swift 原生类型
  • 使用guardif let 有条件地展开可选项
  • 如果您学习 Swift 基础知识会有所帮助。
  • 使用 Control + I 快捷键在 Xcode 中格式化您的代码

【讨论】:

  • 谢谢。我认为数据是字典类型。我没有使用您的解决方案,因为我在检查堆栈溢出之前已对其进行了修复,但我看到您放置了一个可行的解决方案。
【解决方案2】:

原来云代码返回的值是 NSDictionary。这就是我在 Swift 中所做的。

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
    }
}

【讨论】:

  • 请注意,当您使用as! 时,您将强制展开,因此如果值为 nil,则应用程序将崩溃。最好使用as?
  • @user1046037 我明白了,但这不会导致例如“可选(真)”吗?
  • 没错,它会返回一个 Optional,因为从服务器返回的值也可能是 nil。因此,使用if let 语句来检查是否有值,然后在其中编写代码。
猜你喜欢
  • 2015-02-17
  • 2013-02-10
  • 2013-05-21
  • 2012-12-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-22
相关资源
最近更新 更多