У меня есть функция Cloud Code, которая возвращает несколько объектов, некоторые из которых являются логическими. Я хотел бы сделать что-то в моем 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 Code

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.

1
Dups 29 Май 2017 в 04:06

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
    }
}
1
Dups 29 Май 2017 в 09:30

Проблема:

  • После приведения в 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, где это возможно
  • Используйте guard, if let для условного развертывания опций
  • Это поможет, если вы изучите основы Swift.
  • Используйте сочетание клавиш Control + I для форматирования вашего кода в Xcode
1
user1046037 29 Май 2017 в 07:14