web-dev-qa-db-ja.com

Swift 3エラーのコードへのアクセス

Xcode 8ベータ4の新機能であるNSErrorは、Swift Errorプロトコルタイプにブリッジされます。これは、失敗したSKPaymentTransactionsを処理するときにStoreKitに影響します。トランザクションがキャンセルされたためにエラーが発生しなかったことを確認して、ユーザーにエラーメッセージを表示するかどうかを確認する必要があります。これを行うには、エラーのcodeを調べます。ただし、Errorの代わりにNSErrorを使用すると、codeは定義されません。 Errorからエラーコードを適切に取得する方法を理解できていません。

これは、以前のバージョンのSwift 3で機能しました:

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

errorErrorではなくNSErrorであるため、codeはメンバーではありません。

61
Jordan H

SKErrorへのキャストは、xCode 8およびSwift 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は必要ありません。

35
Murray Sagal

Swift 3エラータイプのコードおよびドメインプロパティにアクセスする別のオプションは、次のように拡張します。

extension Error {
    var code: Int { return (self as NSError).code }
    var domain: String { return (self as NSError).domain }
}
116
Leo Dabus

Xcode 8およびSwift 3では、条件付きキャストが常に成功するため、以下を実行する必要があります。

let code = (error as NSError).code

必要に応じてcodeを確認してください。お役に立てれば

47
Andrey M.

これは正しいです(Apple独自のテストではこのアプローチを使用しています)。

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

一方、NSErrorへのキャストはおそらく非推奨になります。

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