728x90
반응형
안녕하세요🐶
빈지식 채우기의 비니🙋🏻♂️입니다.
오늘의 포스팅은 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 를 통해 어떻게 구현되어 있는지 확인이 가능하다.
- 아래 코드를 통해 실제 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)
}
}
- ExpressionMacro 프로토콜을 채택하고 있다.
- 매크로 표현식 자체 구문트리와 컴파일러의 통신이 가능한 컨텍스트를 사용합니다.
- 매크로의 표현식 그 자체의 구문 트리를 나타내는 요소이다.
- 컴파일러와 통신하는데 사용할 수 있는 컨텍스트 요소이다.
- (2)번 항목의 요소에서 단일 Argument를 검색합니다.
- stringify가 단일 매개변수를 사용하고 있기 때문에 Type-Check가 필요합니다.
- 첫 번째 요소는 Int, 두 번째 요소 String 값을 포함한 String 값을 반환합니다.
- 여기서 이상한 점이 있습니다. 분명 해당 매크로는 ExpreSyntax를 반환을 해야 하는데 위 소스에서는 String을 반환하고 있습니다.
- 해당 매크로는 자동으로 Swift Parser를 호출하여 반환하는 String 값을 ExprSyntax 값으로 변환합니다.
- 여기서 이상한 점이 있습니다. 분명 해당 매크로는 ExpreSyntax를 반환을 해야 하는데 위 소스에서는 String을 반환하고 있습니다.
2. 매크로의 종류
- @freestanding(expression)
- 코드의 조각을 반환하는 독립형 매크로
- 독립으로 사용하는 표현식 ( 실행하고 결과를 생성하는 코드 단위 )
이상으로 [WWDC 2023] (4) Swift Macro 포스팅을 마치겠습니다.
틀린 부분이나 궁금한 사항은 댓글 남겨주세요~
참고
728x90
반응형
'Apple 🍎 > WWDC 2023' 카테고리의 다른 글
[WWDC 2023] (6) 스위프트의 새로운 기능 - 2 (0) | 2023.09.08 |
---|---|
[WWDC 2023] (5) 스위프트의 새로운 기능 - 1 (0) | 2023.09.07 |
[WWDC 2023] (3) SwiftData (0) | 2023.08.29 |
[WWDC 2023] (2) Widget 확장 (0) | 2023.08.28 |
[WWDC 2023] (1) SharePlay (4) | 2023.08.28 |