Swift 3는 NSCoder의 작동 방식을 변경합니다.
다른 SO 질문에 언급 된 바와 같이, 같은 값 형식을 디코딩 할 수 Int
또는 Bool
특정 기능을 사용합니다. 예를 들어, decodeInteger 는 Int
다음과 같이 값 을 디코딩하는 데 사용됩니다 .
let value = decodeInteger(forKey key: TestKey)
그러나에서 반환 된 값 decodeInteger
이 String
또는 Bool
또는 다른 무엇인가 Int
?
아니면 TestKey가 잘못된 키 데이터를 포함하고 있기 때문에 실제로 아무것도 매핑하지 않으면 어떻게 될까요?
이러한 오류를 어떻게 우아하게 포착합니까?
decodeInteger
정수가 아닌 키에 사용 하면 예외가 발생합니다. 안타깝게도 NSException
Swift는 직접 처리 할 수 없습니다 (아래 참조 참조).
먼저 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] 삭제
몇 마디 만하겠습니다