2017-05-02 1 views
0

Also habe ich diesen Code in Objective-C, den ich in Swift3 umschreiben muss.Swift 3 Code, der von Objective-C geschrieben wurde, funktioniert nicht

Es scheint jedoch nicht zu funktionieren. Darunter befindet sich die Objective-C und unter, dass meine Rewrite davon swift3:

Objective-C

- (void)handleMobilePayPaymentWithUrl:(NSURL *)url 
{ 
    [[MobilePayManager sharedInstance]handleMobilePayPaymentWithUrl:url success:^(MobilePaySuccessfulPayment * _Nullable mobilePaySuccessfulPayment) { 
     NSString *orderId = mobilePaySuccessfulPayment.orderId; 
     NSString *transactionId = mobilePaySuccessfulPayment.transactionId; 
     NSString *amountWithdrawnFromCard = [NSString stringWithFormat:@"%f",mobilePaySuccessfulPayment.amountWithdrawnFromCard]; 
     NSLog(@"MobilePay purchase succeeded: Your have now paid for order with id '%@' and MobilePay transaction id '%@' and the amount withdrawn from the card is: '%@'", orderId, transactionId,amountWithdrawnFromCard); 
     [ViewHelper showAlertWithTitle:@"MobilePay Succeeded" message:[NSString stringWithFormat:@"You have now paid with MobilePay. Your MobilePay transactionId is '%@'", transactionId]]; 

    } error:^(NSError * _Nonnull error) { 
     NSDictionary *dict = error.userInfo; 
     NSString *errorMessage = [dict valueForKey:NSLocalizedFailureReasonErrorKey]; 
     NSLog(@"MobilePay purchase failed: Error code '%li' and message '%@'",(long)error.code,errorMessage); 
     [ViewHelper showAlertWithTitle:[NSString stringWithFormat:@"MobilePay Error %li",(long)error.code] message:errorMessage]; 

     //TODO: show an appropriate error message to the user. Check MobilePayManager.h for a complete description of the error codes 

     //An example of using the MobilePayErrorCode enum 
     //if (error.code == MobilePayErrorCodeUpdateApp) { 
     // NSLog(@"You must update your MobilePay app"); 
     //} 
    } cancel:^(MobilePayCancelledPayment * _Nullable mobilePayCancelledPayment) { 
     NSLog(@"MobilePay purchase with order id '%@' cancelled by user", mobilePayCancelledPayment.orderId); 
     [ViewHelper showAlertWithTitle:@"MobilePay Canceled" message:@"You cancelled the payment flow from MobilePay, please pick a fruit and try again"]; 

    }]; 
} 

Und mein swift3 umschreiben:

func handleMobilePayPayment(with url: URL) { 
     MobilePayManager.sharedInstance().handleMobilePayPayment(with: url, success: {(mobilePaySuccessfulPayment: MobilePaySuccessfulPayment?) -> Void in 
      let orderId: String = mobilePaySuccessfulPayment!.orderId 
      let transactionId: String = mobilePaySuccessfulPayment!.transactionId 
      let amountWithdrawnFromCard: String = "\(mobilePaySuccessfulPayment!.amountWithdrawnFromCard)" 
      print("MobilePay purchase succeeded: Your have now paid for order with id \(orderId) and MobilePay transaction id \(transactionId) and the amount withdrawn from the card is: \(amountWithdrawnFromCard)") 
       self.alert(message: "You have now paid with MobilePay. Your MobilePay transactionId is \(transactionId)", title: "MobilePay Succeeded") 

     }, error: {(error: Error?) -> Void in 
      let dict: [AnyHashable: Any]? = error?.userInfo 
      let errorMessage: String? = (dict?.value(forKey: NSLocalizedFailureReasonErrorKey) as? String) 
      print("MobilePay purchase failed: Error code '(Int(error?.code))' and message '(errorMessage)'") 
      self.alert(message: errorMessage!, title: "MobilePay Error \(error?.code as! Int)") 
      self.alert(message: error as! String) 
      //TODO: show an appropriate error message to the user. Check MobilePayManager.h for a complete description of the error codes 
      //An example of using the MobilePayErrorCode enum 
      //if (error.code == MobilePayErrorCodeUpdateApp) { 
      // NSLog(@"You must update your MobilePay app"); 
      //} 
     }, cancel: {(_ mobilePayCancelledPayment: MobilePayCancelledPayment?) -> Void in 
      print("MobilePay purchase with order id \(mobilePayCancelledPayment?.orderId!) cancelled by user") 
      self.alert(message: "You cancelled the payment flow from MobilePay, please pick a fruit and try again", title: "MobilePay Canceled") 
     }) 
    } 

Das Problem ist ich bin bekommen ist mit dem Fehler in der Mitte, wie in der Abbildung unten gezeigt.

enter image description here

Ich bin nicht sicher, was ich falsch mache und wie die userinfo zu erhalten und die Error-Info „out“ des Irrtums.

Vielen Dank im Voraus!

Antwort

2

Sie haben werfen error zu NSError

... 
}, error: { error in // according to the ObjC code error is non-optional 
    let nsError = error as NSError 
    let userInfo = nsError.userInfo as! [String:Any] 
    let errorMessage = userInfo[NSLocalizedFailureReasonErrorKey] as! String 
    ... 
    self.alert(message: errorMessage, title: "MobilePay Error \(nsError.code)") 

Grundsätzlich zu überbrücken mit Anmerkungen versehen nicht Typen der Compiler ableiten kann und nie valueForKey verwenden, um einen Wert von einem Benutzer Info Wörterbuch zu erhalten.

+0

Das hat funktioniert! Vielen Dank! –

Verwandte Themen