티스토리 뷰

이번주에 WWDC23에서 공개한 Swift Macros에 관련된 두 세션(Expand on Swift Macros, Write Swift Macros)을 듣고 직접 매크로를 만들어봤는데 블로그에 정리를 좀 하면 좋을 것 같아서 글을 쓰게되었습니다~!

두 세션 다 아직 보지 않았지만 볼 예정이시라면 (?) Expand on Swift Macros -> Write Swift Macros 순서로 시청하는 것을 추천드립니다.

 

매크로란?

 

매크로는 Swift 언어를 사용자에 맞춰서 커스텀해주는 역할을 합니다.

..이게 뭔소리냐하면..

WWDC에서 소개한 예시 중 가장 와닿는 예시는 Codable과 관련된 예시였는데요

저희가 보통 Codable을 채택해서 쓸 때, 따로 CodingKeys를 지정해 줄 필요가 없다면 아래와 같이 간단하게만 작성하면 됩니다.

struct Example: Codable {
    let id: String
    let fullName: String
}

그치만 사실 fullName변수가 json데이터에는 full_name으로 온다면, CodingKeys를 추가해줘야겠죠 ..?

struct Example: Codable {
    let id: String
    let fullName: String

    enum CodingKeys: String, CodingKey {
        case id
        case fullName = "full_name"
    }

    init(from decoder: Decoder) throws { ... }
    func encode(to: encoder: Encoder) throws { ... }
}

이런식으로요!

 

그럼 CodingKeys를 쓰지 않을때는 어떻게 알고.. 이것들이 동작하는 걸까요??

Codable을 사용하면, Swift가 자동으로 관련 코드를 작성해줍니다. 그래서 개발자가 딱히 작동방법을 몰라도 잘 쓸 수 있는 것이죠!!

 

Swift에는 이미 Codable과 비슷하게 이런 기능들을 많이 제공하고 있습니다.

 

근데 Swift에서 제공하는걸로 내가 원하는걸 구현할 수 없다면 Swift 레포지터리에 Contribute를 해서 기능을 추가해야겠죠..?

근데 ..이게 될까요? 🥹🥹 ..힘들겠죠..

 

그래서 Swift 기능을 직접 커스텀할 수 있는게 나온겁니다!!

Swift Macro를 이용하면 Swift컴파일러를 직접 수정하지 않고도 Swift에 자신만의 기능을 추가할 수 있습니다. 

또 잘 만들어서 반복되는 코드들을 없앨 수 있습니다

 

 

매크로의 작동방식

 

1. 코드에 #stringify 매크로를 작성하면 Swift compiler가 이를 인식합니다.

Swift Compiler에는 위와 같이 매크로 선언부가 포함되어 있기 때문에 Swift compiler가 이를 인식할 수 있는 것입니다!

 

 

2. 그치만 이 매크로의 구현 사항(매크로 작성자가 작성한 커스텀 Swift 코드)은 Swift compiler에 있는게 아니라 Compiler Plugin에 있기 때문에, 매크로를 추출해서 compiler plugin으로 보내게 됩니다.

약간 Swift Compiler가 Compiler plugin에게 진짜 매크로 전개식을 달라고 하는 것이죠 (?)

3. compiler plugin은 secure sandbox내에서 별도의 프로세스로 실행되고, expansion(전개식)을 반환합니다.

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
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
글 보관함