Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- Observable
- 스위프트
- clean architecture
- Human interface guide
- Clean Code
- rxswift
- UITextView
- combine
- uiscrollview
- SWIFT
- map
- swift documentation
- Xcode
- 클린 코드
- tableView
- collectionview
- HIG
- uitableview
- ios
- 리펙토링
- 리팩토링
- MVVM
- RxCocoa
- Protocol
- Refactoring
- 리펙터링
- UICollectionView
- swiftUI
- ribs
- 애니메이션
Archives
- Today
- Total
김종권의 iOS 앱 개발 알아가기
[iOS - swift] Swift Macro 시작하기 (매크로 생성, 형태) 본문
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
'Swift Macro' 카테고리의 다른 글
Comments