Xcode 8ベータ4の新機能であるNSError
は、Swift Error
プロトコルタイプにブリッジされます。これは、失敗したSKPaymentTransaction
sを処理するときに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
}
}
...
}
error
はError
ではなくNSError
であるため、code
はメンバーではありません。
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
は必要ありません。
Swift 3エラータイプのコードおよびドメインプロパティにアクセスする別のオプションは、次のように拡張します。
extension Error {
var code: Int { return (self as NSError).code }
var domain: String { return (self as NSError).domain }
}
Xcode 8およびSwift 3では、条件付きキャストが常に成功するため、以下を実行する必要があります。
let code = (error as NSError).code
必要に応じてcode
を確認してください。お役に立てれば
これは正しいです(Apple独自のテストではこのアプローチを使用しています)。
if error._code == SKError.code.paymentCancelled.rawValue { ... }
一方、NSErrorへのキャストはおそらく非推奨になります。
let code = (error as NSError).code // CODE SMELL!!
if code == SKError.code.paymentCancelled.rawValue { ... }