- This topic has 5개 답변, 4명 참여, and was last updated 4 years, 5 months 전에 by 구글 찬양해.
-
글쓴이글
-
-
구글 찬양해참가자
- 글작성 : 1
- 답글작성 : 2
안녕하세요 야곰선생님의 유튜브로 스위프트를 갓 공부한 초보입니다
짧게 문법을 익히고 xcode로 앱개발 예제를 따라가던 도중 궁금한점이 생겨서 검색을 해봤지만 시원하게 해답을 찾지 못했습니다.
do {
try fileManager.moveItem(at: fromURL, to: toURL)
} catch let error as NSError {
print(“Error: (error.domain)”)
}이 코드에서 error as NSError가 잘 이해가 가지 않습니다.
as문은 타입캐스팅(업캐스팅)을 할때 사용하는 것으로 알고있는데 ( 부모객체 = 자식인스턴스 as 부모인스턴스 이런식)
Apple developer에 검색해보니 error은 프로토콜이고 NSError는 클래스인데
NSError 클래스가 error 프로토콜에게 상속한건 아닌것 같아서 질문드립니다.
2020-07-05 오전 3:27 #25960 -
야곰키 마스터
- 글작성 : 37
- 답글작성 : 579
do-try-catch 구문에서 catch에서 catch 뒤에 매개변수 패턴 등을 명시하지 않으면 암묵적으로
error
라는 이름으로 Swift의Error
타입의 인스턴스가 전달됩니다. (Error
는 스위프트의 프로토콜입니다)Swift Error Handling Document의 Handling Errors Using Do-Catch 챕터 참고.
위 코드에서
as NSError
라고 표현한 것은 암묵적으로 전달된Error
타입의 인스턴스를 Objective-C의NSError
라는 타입으로 브릿징(Bridging) 해달라고 하는겁니다. 애플의 Foundation 프레임워크는 스위프트 언어가 나오기 전에는 대부분 Objective-C 언어로 구현되고 사용할 수 있었죠. 그 때 오류를 표현하기 위해 사용했던 클래스가NSError
입니다.그런데 Swift의
Error
에는domain
프로퍼티가 없고 Objective-C의NSError
에는domain
프로퍼티가 있으니 브릿징해서domain
프로퍼티를 사용하고 싶었던겁니다.ㅎㅎ 앞에NS
가 붙은 타입은 대부분 Objective-C의 타입이라고 보면 됩니다. 심지어 스위프트 언어 처음에는 지금은 스위프트 타입이 없고 대부분NS
가 붙은 Objective-C 타입을 써야 했더랬죠. 지금은 그런 타입이 많이 사라졌지만, Foundation의 API가 아직도 매개변수를 Objective-C로 전달받아야 하는 등 아직은 잔재가 좀 남아있어요.
Error
와NSError
처럼 브릿징 해서 사용할 수 있는 자매품으로는String
/NSString
,Dictionary
/NSDictionary
,Set
/NSSet
,Array
/NSArray
등 많은 친구들이 있죠. ㅎㅎ고인물(?) 들이 옛 특성들을 사용하고 싶을 때 종종 사용하기도 하고요, 프레임워크 API가 Objective-C의 타입으로 매개변수가 정의되어 있을 때 명시적으로 브릿징 해야할때 사용하기도 합니다.
브릿징에 대해 조금 더 찾아보면 좋을 것 같아요.2020-07-05 오전 11:10 #25970 -
구글 찬양해참가자
- 글작성 : 1
- 답글작성 : 2
정리하자면 예전 objective-c언어를 썼을때 사용했던 NSError의 .domain 프로퍼티를 지금 사용하고싶어서
스위프트의 error를 NSErorr로 브릿징을 한거네요 의미와 사용방법이 이해갔습니다! 감사합니다
근데 error에 캐치되는 에러는 Error프로토콜 타입의 인스턴스인데 이걸 NSError로 브릿징이 어떻게 되는지 모르겠습니다.
NSError는 NSObject를 상속할 뿐이고, Error는 그냥 빈 프로토콜일 뿐인데 어떻게 코드가 구현되어있길래 이게
error as NSError가 실행되는지 모르겠습니다… 그냥 xcode에서 알아서 브릿지 해준다 라는 느낌으로 넘어가면 될까요?
2020-07-05 오후 5:31 #25985 -
GangWoon참가자
- 글작성 : 5
- 답글작성 : 7
https://corykim0829.github.io/ios/NS-classes-in-Swift/#
블로그 글에서 보면 NSNotification.Name을 typealias을 사용해서 Notification.Name로 변환해서 사용합니다.
여기서 제가 추론한 정보는 error 인스턴스가 내부적으로 NSError을 래핑해서(위에서 언급한 typealias으로 변환작업) 사용함으로 as를 사용해서 변환이 가능합니다.
https://gangwoon.tistory.com/5
예제를 들어서 정리했습니다!!!
2020-07-06 오전 4:16 #25992 -
corykim0829참가자
- 글작성 : 1
- 답글작성 : 1
Swift의 Error는 브릿징되는 다른 클래스들과 달리 프로토콜입니다.
error as NSError가 어떻게 동작하는지에 대해서 먼저 답하자면,
NSError의 구현 코드를 보게되면 NSError는 Error 프로토콜을 채택한 하나의 클래스입니다.
여기서 브릿징이 될 때, Error 프로토콜에 이미 충분한 정보가 저장되어있기 때문에 Error와 NSError 간의 브릿징은 컴파일러가 정상적으로 처리하게 된다고 합니다.또한 Swift github 저장소에 Error Handling Rationale and Proposal 문서를 보면 다음과 같이 설명되어있습니다.
In the meanwhile, developers who must handle an Objective-C exception can always do so by writing a stub in Objective-C to explicitly “bridge” the exception into an
NSError
out parameter. This isn’t ideal, but it’s acceptable.Objective-C 요소를 다루고 싶을 때에는 브릿지를 통해 사용하는 것이 허용된다고 적혀있습니다.
Reference
– https://stackoverflow.com/questions/50010029/nserror-and-error-in-swift2020-07-06 오후 11:23 #26007
-
-
글쓴이글
- 답변은 로그인 후 가능합니다.