본문 바로가기
Apple🍎/WWDC 2023

[WWDC 2023] (4) Swift Macro

by 텅빈비니 2023. 9. 6.
반응형

안녕하세요🐶

빈지식 채우기의 비니🙋🏻‍♂️입니다.

 

오늘의 포스팅은 WWDC 2023의 네 번째 - Swift Macro에 대해 알아보도록 하겠습니다.

 

1. 매크로의 예시

  • Swift 5.9 에 도입하였다.
  • 반복적인 코드를 매크로를 통해 쉽게 여러 기능을 수행할 수 있다.
  • 컴파일 시간에 반복 코드를 생성할 수 있고 코드를 읽기 쉽게 만들 수 있다.
let calculations = [
    ( 1 + 1, "1 + 1"),
    ( 2 + 3, "2 + 3"),
    ( 7 - 3, "7 - 3"),
    ...
    ( 3 * 8, "3 * 5")
]
  • 첫 번째 값은 Int, 두 번째 값은 String 인 Tuple 형태의 배열이 있습니다.
  • 중복으로 작성된 코드이고, 실수하기 쉬운 형태입니다.
    • 결과가 실제로 계산과 일치한다고 누구도 보장할 수 없기 형태이기 때문에 실수가 일어날 가능성이 높습니다.
let calculations = [
    #stringify(1 + 1),
    #stringify(2 + 3),
    #stringify(7 - 3),
    ...
    #stringify(3 * 8)
]
  • Swift 매크로를 사용하여 단순화한 형태입니다.
  • 해당 매크로를 통해 중복코드가 많이 개선되었습니다.
@freestanding(expression)
macro stringify(_ value: Int) -> (Int, String)
  • #stringify 매크로는 상단 코드와 같이 정의되어 있습니다.
    • Int 값을 입력받고 (Int, String) 형태의 Tuple을 반환합니다.

컴파일 에러 예시

  • #stringify의 매크로 입력 값은 Int인데 상단처럼 String 값을 넣을 시 
    • 컴파일러는 매크로를 적용하지 않고 오류를 발생합니다.

Expand Macro

  • Expand Macro 를 통해 어떻게 구현되어 있는지 확인이 가능하다.
  • 아래 코드를 통해 실제 stringify 매크로가 어떻게 구현되어 있는지 확인해보도록 하겠습니다.
public struct StringifyMacro: ExpressionMacro {		// (1)
    public static func expansion(
        of node: some FreestandingMacroExpansionSyntax,		// (2)
        in context: some MacroExpansionContext		// (3)
    ) -> ExprSyntax {
        guard let argument = node.argumentList.first?.expression else {		// (4)
            fatalError("compiler bug: the macro does not have any arguments")
        }

        return "(\(argument), \(literal: argument.description))"	// (5)
    }
}
  1. ExpressionMacro 프로토콜을 채택하고 있다.
    • 매크로 표현식 자체 구문트리와 컴파일러의 통신이 가능한 컨텍스트를 사용합니다.
  2. 매크로의 표현식 그 자체의 구문 트리를 나타내는 요소이다.
  3. 컴파일러와 통신하는데 사용할 수 있는 컨텍스트 요소이다.
  4. (2)번 항목의 요소에서 단일 Argument를 검색합니다.
    • stringify가 단일 매개변수를 사용하고 있기 때문에 Type-Check가 필요합니다.
  5. 첫 번째 요소는 Int, 두 번째 요소 String 값을 포함한 String 값을 반환합니다.
    • 여기서 이상한 점이 있습니다. 분명 해당 매크로는 ExpreSyntax를 반환을 해야 하는데 위 소스에서는 String을 반환하고 있습니다.
      • 해당 매크로는 자동으로 Swift Parser를 호출하여 반환하는 String 값을 ExprSyntax 값으로 변환합니다.

 

2. 매크로의 종류

매크로의 종류

  • @freestanding(expression)
    • 코드의 조각을 반환하는 독립형 매크로
    • 독립으로 사용하는 표현식 ( 실행하고 결과를 생성하는 코드 단위 )

 

이상으로 [WWDC 2023] (4) Swift Macro 포스팅을 마치겠습니다.
틀린 부분이나 궁금한 사항은 댓글 남겨주세요~


참고

반응형