Programing

Swift 3 오류에서 코드 액세스

lottogame 2020. 11. 16. 07:48
반응형

Swift 3 오류에서 코드 액세스


Xcode 8 베타 4의 새로운 기능 NSError은 Swift Error프로토콜 유형에 연결됩니다 . 이는 실패한을 처리 할 때 StoreKit에 영향을줍니다 SKPaymentTransaction. 사용자에게 오류 메시지를 표시할지 여부를 알기 위해 트랜잭션이 취소 되었기 때문에 오류가 발생하지 않았는지 확인해야합니다. 오류의 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구성원이 아닙니다.


캐스팅 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 { ... }

사용하다

error._code == NSURLErrorCancelled

오류 코드와 일치합니다.

참고 URL : https://stackoverflow.com/questions/38711269/accessing-code-in-swift-3-error

반응형