Доступ к коду в Swift 3 Error
Новое в Xcode 8 beta 4, NSError
подключено к типу протокола Swift Error
. Это влияет на StoreKit при работе с неудачными SKPaymentTransaction
s. Вы должны убедиться, что ошибка не произошла, потому что транзакция была отменена, чтобы узнать, показывать ли пользователю сообщение об ошибке. Вы делаете это, исследуя ошибку code
. Но вместо Error
Error
не существует 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
not NSError
, code
не является членом.
Ответы
Ответ 1
Кастинг для 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
.
Ответ 2
Другой вариант доступа к свойствам кода и домена в типах ошибок Swift 3 распространяется следующим образом:
extension Error {
var code: Int { return (self as NSError).code }
var domain: String { return (self as NSError).domain }
}
Ответ 3
Теперь в Xcode 8 и swift 3 условный отбор всегда выполняется успешно, поэтому вам нужно сделать следующее:
let code = (error as NSError).code
и проверьте code
для ваших нужд. Надеюсь, что это поможет
Ответ 4
Это правильно (собственные тесты Apple используют этот подход):
if error._code == SKError.code.paymentCancelled.rawValue { ... }
С другой стороны, кастинг в NSError, скорее всего, будет устаревшим:
let code = (error as NSError).code // CODE SMELL!!
if code == SKError.code.paymentCancelled.rawValue { ... }