기초적인 swift 문법 질문드립니다 ㅠㅠ

5 답변 글타래를 보이고 있습니다
  • 글쓴이
    • 구글 찬양해
      참가자
      • 글작성 : 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 프로토콜에게 상속한건 아닌것 같아서 질문드립니다.

    • 야곰
      키 마스터
      • 글작성 : 37
      • 답글작성 : 580

      do-try-catch 구문에서 catch에서 catch 뒤에 매개변수 패턴 등을 명시하지 않으면 암묵적으로 error라는 이름으로 Swift의 Error 타입의 인스턴스가 전달됩니다. (Error는 스위프트의 프로토콜입니다)

      Swift Error Handling DocumentHandling 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로 전달받아야 하는 등 아직은 잔재가 좀 남아있어요.
      ErrorNSError처럼 브릿징 해서 사용할 수 있는 자매품으로는 String/NSString, Dictionary/NSDictionary, Set/NSSet, Array/NSArray 등 많은 친구들이 있죠. ㅎㅎ

      고인물(?) 들이 옛 특성들을 사용하고 싶을 때 종종 사용하기도 하고요, 프레임워크 API가 Objective-C의 타입으로 매개변수가 정의되어 있을 때 명시적으로 브릿징 해야할때 사용하기도 합니다.
      브릿징에 대해 조금 더 찾아보면 좋을 것 같아요.

    • 구글 찬양해
      참가자
      • 글작성 : 1
      • 답글작성 : 2

      정리하자면 예전 objective-c언어를 썼을때 사용했던 NSError의 .domain 프로퍼티를 지금 사용하고싶어서 

      스위프트의 error를 NSErorr로 브릿징을 한거네요 의미와 사용방법이 이해갔습니다! 감사합니다

      근데 error에 캐치되는 에러는 Error프로토콜 타입의 인스턴스인데 이걸 NSError로 브릿징이 어떻게 되는지 모르겠습니다.

      NSError는 NSObject를 상속할 뿐이고, Error는 그냥 빈 프로토콜일 뿐인데 어떻게 코드가 구현되어있길래 이게

      error as NSError가 실행되는지 모르겠습니다… 그냥 xcode에서 알아서 브릿지 해준다 라는 느낌으로 넘어가면 될까요?

       

       

      • 이 답변은 구글 찬양해에 의해 3 years, 9 months 전에 수정됐습니다.
      • 이 답변은 구글 찬양해에 의해 3 years, 9 months 전에 수정됐습니다.
    • 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

      예제를 들어서 정리했습니다!!!

      • 이 답변은 GangWoon에 의해 3 years, 9 months 전에 수정됐습니다.
      • 이 답변은 GangWoon에 의해 3 years, 9 months 전에 수정됐습니다.
    • 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-swift

    • 구글 찬양해
      참가자
      • 글작성 : 1
      • 답글작성 : 2

      야곰님, GangWoon님,  corykim0829님 정성스러운 답변 감사합니다.

      문서들를 읽어보며 이해 해보도록 하겠습니다.

5 답변 글타래를 보이고 있습니다
  • 답변은 로그인 후 가능합니다.

logo landscape small

사업자번호 : 743-81-02195
통신판매업 신고번호 : 제 2022-충북청주-1278 호
고객센터 : 카카오톡채널 @yagom