2016-08-02 2 views
47

Xcode 8 베타 4의 새로운 기능인 NSError은 Swift Error 프로토콜 유형에 연결됩니다. 이는 SKPaymentTransaction을 처리 할 때 StoreKit에 영향을 미칩니다. 트랜잭션이 취소되어 사용자에게 오류 메시지를 표시할지 여부를 알기 때문에 오류가 발생하지 않았는지 확인해야합니다. 오류 code을 검토하여이 작업을 수행하십시오. 그러나 NSError 대신 Error을 사용하면 code이 정의되지 않습니다. Error에서 오류 코드를 올바르게 가져 오는 방법을 알아낼 수 없었습니다. Swift 3의 코드 액세스 오류

는 스위프트 3의 이전 버전에서 일 :
func failedTransaction(_ transaction: SKPaymentTransaction) { 
    if let transactionError = transaction.error { 
     if transactionError.code != SKErrorCode.paymentCancelled.rawValue { 
      //show error to user 
     } 
    } 
    ... 
} 

는 이제 errorError하지 NSError이다 code는 구성원이 아닙니다.

+1

'시도 NSError로) .code! = SKErrorCode.PaymentCancelled {' –

+1

그냥 NSError로 캐스팅 해 주셔서 감사합니다. @LeoDabus – Joey

답변

28

SKError에 캐스팅하는 엑스 코드 8 스위프트 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 필요 없음을 바랍니다.

+0

올바른 답변이므로 가장 정확한 답변을 업데이트하십시오. 'NSError'로 변환하는 대신에 이렇게하는 것이 훨씬 더 좋습니다. 그것을 확인했다. – Joey

+0

그게 좋지 않아? 나는 ALAssets에서도 똑같은 문제가있다. 그러나 거기에 SKError가있는 것 같지 않습니다. –

85

스위프트 3 오류 유형 코드 및 도메인 속성에 액세스하는 또 다른 옵션은 다음과 같이 연장된다

extension Error { 
    var code: Int { return (self as NSError).code } 
    var domain: String { return (self as NSError).domain } 
} 
+0

@Joey 내가 모바일에 있었기 때문에 올바른 구문을 검사 할 수 없었습니다. –

+2

@ murray-sagal의 대답을 확인하십시오. Objective-C 개체로 다시 전환하는 대신 새로 제공된 SKError를 사용하는 것이 더 좋습니다. – o15a3d4l11s2

33
엑스 코드 8 자

및 신속한 3 조건 캐스트 당신이 다음을 수행해야합니다, 그래서 항상 성공 :

let code = (error as NSError).code 

귀하의 필요에 따라 code을 확인하십시오. ...이

+0

감사합니다. 이것은 내 문제를 해결합니다. – xyzpatience

7

이 올바른지 (애플의 시험이 방법 사용) : NSError에 캐스팅,

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

다른 한편으로는 아마 곧 더 이상 사용되지 않습니다 : (transaction.error 경우

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

사과 자체 테스트에서 사용한 접근법에 대한 링크가 있습니까? –

+0

글쎄, @ AndrewPaulSimmons 좋은 깨끗한 링크가 아니었지만 Apple의 Git repo for Swift를 확인한 다음 "_code"를 검색하면 오류 개체를 처리하는 모든 자체 테스트를 볼 수 있습니다. 그것을 확인하십시오 : https://github.com/apple/swift/search?utf8=%E2%9C%93&q=_code – Rob

+3

코드 냄새가 올바른 클래스로 캐스팅하는 것이 좋습니다, 그러나 외부에서 밑줄 표시된 멤버에 액세스하는 것이 좋습니다? ''let '' 또는''guard let''에서'.code'에 접근해야한다는 것을 허락합니다. – devios1

관련 문제