Подтвердить что ты не робот

Доступ к коду в 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 не является членом.

4b9b3361

Ответ 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 { ... }