2016-08-02 72 views
47

Xcode 8 beta 4中的新增功能,NSError橋接到Swift Error協議類型。這在處理失敗的SKPaymentTransaction時會影響StoreKit。您應該檢查以確保沒有發生錯誤,因爲事務被取消以知道是否向用戶顯示錯誤消息。您通過檢查錯誤的code來執行此操作。但用Error而不是NSError,沒有定義code。我一直無法弄清楚如何從Error正確獲取錯誤代碼。在Swift 3中訪問代碼錯誤

這曾在以前的版本雨燕3:

func failedTransaction(_ transaction: SKPaymentTransaction) { 
    if let transactionError = transaction.error { 
     if transactionError.code != SKErrorCode.paymentCancelled.rawValue { 
      //show error to user 
     } 
    } 
    ... 
} 

現在errorErrorNSErrorcode不是成員。

+1

嘗試'如果(transaction.error作爲NSError).code!= SKErrorCode.PaymentCancelled {' –

+1

這是行之有效的,只是把它作爲'NSError',謝謝@LeoDabus – Joey

回答

28

鑄造到SKError似乎在Xcode 8和斯威夫特3是爲我工作...

guard let error = transaction.error as? SKError else {return} 
    switch error.code { // https://developer.apple.com/reference/storekit/skerror.code 
    case .unknown: break 
    case .paymentCancelled: break 
    case .clientInvalid: break 
    case .paymentInvalid: break 
    case .paymentNotAllowed: break 
    case .cloudServiceNetworkConnectionFailed: break 
    case .cloudServicePermissionDenied: break 
    case .storeProductNotAvailable: break 
    } 

無需rawValue

+0

更正了正確的答案,因爲它是最正確的。更喜歡這樣做,而不是投射到「NSError」。證實它有效。 – Joey

+0

這不是很好嗎?我有同樣的問題,但在ALAssets。但是在那裏似乎沒有SKError等價物 –

85

另一種選擇訪問斯威夫特3錯誤類型的代碼和域的屬性是其擴展如下:

extension Error { 
    var code: Int { return (self as NSError).code } 
    var domain: String { return (self as NSError).domain } 
} 
+0

@Joey對不起,我在我的手機上,所以我無法檢查正確的語法。 –

+2

查看@ murray-sagal的答案,最好使用新提供的SKError,而不是切換回Objective-C對象。 – o15a3d4l11s2

33

現在在Xcode 8和迅速3有條件的演員陣容總是成功,所以你需要做以下幾點:

let code = (error as NSError).code 

並檢查code您的需要。希望這有助於

+0

謝謝!這解決了我的問題 – xyzpatience

7

這是正確的(蘋果公司自己的測試使用此方法):

if error._code == SKError.code.paymentCancelled.rawValue { ... } 

在另一方面,鑄造NSError將可能很快被棄用:

let code = (error as NSError).code // CODE SMELL!! 
if code == SKError.code.paymentCancelled.rawValue { ... } 
+0

是否有鏈接到蘋果自己的測試使用的方法? –

+0

那麼,@AndrewPaulSimmons那裏沒有一個很好的乾淨的鏈接,但如果你檢查出Apple的Swift的Git倉庫,然後搜索「_code」,你可以看到他們所有的測試,他們以這種方式處理Error對象。檢查出來:https://github.com/apple/swift/search?utf8=%E2%9C%93&q=_code – Rob

+3

你認爲鑄造到正確的類代碼氣味,但外部訪問下劃線的成員是好的?當然,你應該在'if let'或'guard let'中訪問'.code',而不是盲目地假設演員工作。 – devios1