Notice
Recent Posts
Recent Comments
Link
관리 메뉴

김종권의 iOS 앱 개발 알아가기

[iOS - swift] 7. WWDC2023 정리 - 스위프트의 새로운 기능 (2) (Swift Macro 개념, Swift Macro 동작 원리) 본문

WWDC 정리/WWDC 2023 정리

[iOS - swift] 7. WWDC2023 정리 - 스위프트의 새로운 기능 (2) (Swift Macro 개념, Swift Macro 동작 원리)

jake-kim 2023. 6. 12. 22:53

(1). 스위프트의 새로운 기능 - (조건문이 표현식으로 변경, type check 속도 향상, repeat each 제네릭스)

(2). 스위프트의 새로운 기능 - (Swift Macro 개념, Swift Macro 동작 원리)

(3). 스위프트의 새로운 기능 - 애플이 Foundation을 공개한 이유, ~Copyable, C++ interop, Actor and concurrency, unownedSerialExcutor

Swift Macro 기능

  • Swift Macro가 나온이유?
    • 언어 자체의 기능을 확장하여 상용구를 제거하고 Swift의 Expression을 더 많이 활용 가능
    • Swift의 디자인은 형식이 적고 읽기 쉽고, 쓰기 쉬운 명확하고 간결한 코드로 작성 가능한 Expression (표현력)이 핵심

Swift Macro

ex) assert문에서 조건이 거짓이면 프로그램을 중지하지만 그런 경우 무엇이 잘못되었는지에 대한 정보를 거의 얻지 못하고 파일과 줄 번호만 획득이 가능

  • 기존에 XCTest에서는 두 값을 개별적으로 사용하는 assert-equal 작업을 제공하므로 에러가 발생했을때 코드만 보고 바로 두 값이 같지 않다는 것을 알아챌수있음

assert-equal

  • 애플에서 테스트 말고도 swift에서 이러한 기능을 만들려면 어떻게 처리해야하는지 고민이 되었고 그렇게하여 Swift Macro가 나오게 됨
  • assert라는 매크로를 확장하여 #assert로 생성

macro는 정보도 보기쉽게 알려줌

  • Macro는 유형이나 함수와 마찬가지로 API이므로 Macro를 정의하는 모듈을 import해야 사용이 가능

  • assert 매크로 선언부 - 함수처럼 생김

매크로 선언부

  • 대부분의 macro는 문자열을 통해 모듈 및 type을 지정하는 externalMacro로 정의

Swift Macro 동작 원리

1. externalMacro는 스위프트 컴파일러와 다른 곳에 존재

2. 스위프트 컴파일러가 Macro에 접근하여 해당 기능을 사용

3. 플러그인은 새로운 소스 코드를 생성한 다음 다시 Swift Compiler에 통합

Swift Macro 동작 원리

Swift Macro 5가지 roles

  • macro를 정의할 때 위쪽에 @freestanding(epression)과 같은 키워드를 사용
    • @freestanding(epression): 값을 생성할 수 있는 모든 곳에서 사용할 수 있기 때문에 식 매크로 유형으로 정의한것

식 매크로 유형

  • 매크로의 5가지 roles
    • attached(member): type 또는 extrension에서 새 맴버를 추가한다는 의미
    • atteched(peer): 비동기 메소드의 completion handler 버전을 생성하는것과 같이 특정 작업에 의해 연결된 작업을 수행할 때 사용
    • attached(accessor): 접근자 매크로이며, property에 대한 특정 작업을 수행하는 것 (property wrapper와 비슷하지만 더 유연한 방식으로 추상화가 가능)
    • attahced(memberAttreibute): type이나 표현식 선언부에 property wrapper와 같은 속성을 추가할 수 있는 매크로 유형
    • attached(conformance): type이나 표현식에 프로토콜과 같은 타입들을 준수하게끔 할 수 있는 매크로 유형

ex) Combine에서 ObseravableObject를 준수하도록 하고 내부 프로퍼티들은 모두 @Published 를 선언해야하는데 이 때 Swift Macro를 사용하여 중복 코드 제거와 함께 깔끔하게 사용이 가능

(Swift Macro 적용 전)

(Swift Macro 적용 후) - @Observable 매크로 사용

  • @Observable 매크로의 role은 세 가지

Observable 매크로의 역할 3가지

(매크로로 인해서 생략된 코드들 - dimmed 된 영역)

  • Swift Macro에 의해서 코드가 지나치게 추상화 된다고 생각 할 수 있지만, 애플에서는 이를 위해 Xcode에서 손쉽게 매크로가 어떻게 확장되어 있는지 확인이 가능
    • 오른쪽마우스 -> Exapnd Macro 선택

매크로 확장 살펴보기

* 참고

https://github.com/kishikawakatsumi/swift-power-assert

https://developer.apple.com/videos/play/wwdc2023/10164/

Comments