Notice
Recent Posts
Recent Comments
Link
관리 메뉴

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

[iOS - swift] Swift Macro 시작하기 (매크로 생성, 형태) 본문

Swift Macro

[iOS - swift] Swift Macro 시작하기 (매크로 생성, 형태)

jake-kim 2023. 9. 7. 01:40

Swift Macro

  • 반복되는 코드 부분의 Boilerplate를 줄이기 위한 목적으로 활용

매크로가 수행되는 방법

  • 한 예로 Swift 패키지 플렛폼의 #stringify 매크로가 호출되면, Swift Compiler는 해당 매크로에 대한 구현이 있는 Compiler plugin으로 해당 매크로를 달라는 형태로 요청
    • Compiler plugin은 보안 sandbox 별도의 프로세스로 실행

  • Compiler plugin은 매크로 사용을 처리하고 매크로에 의해 생성된 새로운 코드 조각인 "expansion"을 반환

  • Swift compiler에서 expansion을 받으면 Swift compiler가 expansion을 프로그램에 추가하고 코드의 확장을 함께 컴파일

(Swift Macro 관련 자세한 개념은 이전 포스팅 글, WWDC2023 정리 참고)

Swift Macro 환경

  • Xcode 15 Beta 이상
  • 스위프트 5.9

Swift Macro 파일 생성

  • Xcode -> New -> Package... 선택

  • Swift Macro 선택

  • 처음 파일을 만들었을때 상태
    • Sources하위에 3가지 파일이 존재
    • 생성 이름을 "MySample"로 한 경우

  • Swift Macro를 구현할 때 알아야하는 주요 3가지 파일
    • main.swift
    • {생성이름}Macro.swift
    • {생성이름}.swift
  • 3가지 파일의 쓰임
    • main.swift에서 만든 매크로를 테스트해볼 수 있도록 샘플 코드들이 있는 장소
    • {생성이름}Macro.swift에서 매크로 로직을 구현
    • 이 매크로는 MySample.swift에 등록하여 사용하는 쪽에서 #을 붙여서 사용할 수 있도록 인터페이스 역할

main.swift 파일

  • 매크로를 테스트해볼 수 있도록 샘플 코드들이 있는 장소
    • main.swift파일을 먼저 확인하여 이 매크로는 언제 사용하는 것인지 빠르게 파악
    • expand macro를 사용하면 매크로가 어떤 구현으로 되어있는지 파악이 용이

  • expand macro를 하면 #stringify(a + b)의 반환값이 보여지므로, 튜플 형태의 Int와 String 타입으로 반환된다는 것을 확인

{생성이름}Macro.swift파일

  • 매크로 로직을 구현

{생성이름}.swift

  • {생성이름}Macro.swift파일에서 구현한 로직 매크로 등록
  • 사용하는 쪽에서 #을 붙여서 사용할 수 있도록 인터페이스 역할을 담당
  • macro타입은 @freestanding(expression)으로 정의
    • stringify라는 이름으로 외부에서 접근
    • #externalMacro로 인터페이스 작성
    • module 인수에는 매크로 로직이 구현된 파일 이름 {생성이름}Macro.swift이 들어가고, type 인수에는 매크로 로직이 구현된 파일 안의 구조체를 기입
@freestanding(expression)
public macro stringify<T>(_ value: T) -> (T, String) = #externalMacro(module: "MySampleMacros", type: "StringifyMacro")

 

매크로 로직 구현 부분인 {생성이름}.Macro.swift은 다음 포스팅 글에서 계속

 

* 참고

https://docs.swift.org/swift-book/documentation/the-swift-programming-language/macros/

https://blog.devgenius.io/exploring-new-swift-macros-api-245e0b1f7c8d

 

Comments