Swift 3 : NSCoder decodeX 함수가 잘못된 값 유형을 디코딩하는 경우 오류를 잡는 방법은 무엇입니까?

Crashalot

Swift 3는 NSCoder의 작동 방식을 변경합니다.

다른 SO 질문에 언급 된 바와 같이, 같은 값 형식을 디코딩 할 수 Int또는 Bool특정 기능을 사용합니다. 예를 들어, decodeIntegerInt다음과 같이 값 을 디코딩하는 데 사용됩니다 .

let value = decodeInteger(forKey key: TestKey)

그러나에서 반환 된 값 decodeIntegerString또는 Bool또는 다른 무엇인가 Int?

아니면 TestKey가 잘못된 키 데이터를 포함하고 있기 때문에 실제로 아무것도 매핑하지 않으면 어떻게 될까요?

이러한 오류를 어떻게 우아하게 포착합니까?

다른 코드

decodeInteger정수가 아닌 키에 사용 하면 예외가 발생합니다. 안타깝게도 NSExceptionSwift는 직접 처리 할 수 ​​없습니다 (아래 참조 참조).

먼저 ObjC에서 ObjC 예외를 처리하는 래퍼를 작성하고 Swift에 연결해야합니다 ( 이 답변에서 영감을 얻음 ).

/// -------------------------------------------
/// ObjC.h
/// -------------------------------------------
#import <Foundation/Foundation.h>

@interface ObjC : NSObject

+ (BOOL)catchException:(void(^)())tryBlock error:(__autoreleasing NSError **)error;

@end

/// -------------------------------------------
/// ObjC.m
/// -------------------------------------------
#import "ObjC.h"

@implementation ObjC

+ (BOOL)catchException:(void(^)())tryBlock error:(__autoreleasing NSError **)error {
    @try {
        tryBlock();
        return YES;
    }
    @catch (NSException *exception) {
        NSMutableDictionary * userInfo = [NSMutableDictionary dictionaryWithDictionary:exception.userInfo];
        [userInfo setValue:exception.reason forKey:NSLocalizedDescriptionKey];
        [userInfo setValue:exception.name forKey:NSUnderlyingErrorKey];

        *error = [[NSError alloc] initWithDomain:exception.name
                                            code:0
                                        userInfo:userInfo];
        return NO;
    }
}

@end

이제 Swift에서 예외를 포착 할 수 있습니다.

do {
    try ObjC.catchException {
        let age = aDecoder.decodeInteger(forKey: "firstName")
    }
} catch {
    print(error.localizedDescription)
}

참고 문헌 : Swift와 함께 ObjectiveC 사용 : Cocoa 디자인 패턴 채택

Swift 오류 처리는 Objective-C의 예외 처리와 비슷하지만 완전히 별개의 기능입니다. Objective-C 메서드가 런타임 중에 예외를 throw하면 Swift는 런타임 오류를 트리거합니다. Swift에서 직접 Objective-C 예외를 복구 할 수있는 방법은 없습니다. 모든 예외 처리 동작은 Swift에서 사용하는 Objective-C 코드로 구현되어야합니다.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

Related 관련 기사

뜨겁다태그

보관