2017-05-02 9 views
0

所以我在Objective-C中有这个代码,我需要重写Swift3。从Objective-C重写的Swift 3代码不起作用

但是它似乎没有工作。下面是Objective-C和下我吧重写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"]; 

    }]; 
} 

而且我Swift3改写:

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

问题的我中间出现错误,如下图所示。

enter image description here

我不确定我在做什么错误,以及如何获得用户信息和错误的错误信息“走出去”。

在此先感谢!

回答

2

你必须桥投errorNSError

... 
}, 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)") 

基本上没有注释类型的编译器可以推断,从不使用valueForKey获得来自用户信息字典的值。

+0

这工作!谢谢! –