$30 off During Our Annual Pro Sale. View Details »

個人開発アプリでの Swift Macros 紹介

swiftty
October 17, 2023

個人開発アプリでの Swift Macros 紹介

【ハイブリット開催】Mobile勉強会 Wantedly × チームラボ #11
https://wantedly.connpass.com/event/297601/

で発表した資料です

swiftty

October 17, 2023
Tweet

More Decks by swiftty

Other Decks in Technology

Transcript

  1. © 2023 Wantedly, Inc.
    個人開発アプリでの
    Swift Macros 紹介
    Mobile勉強会 Wantedly × チームラボ #11
    Oct. 17 2023 - 林達也

    View Slide

  2. 自己紹介
    © 2023 Wantedly, Inc.

    View Slide

  3. Agenda
    1. Swift Macros とは
    2. 開発中のアプリでの利用例
    ○ member
    ○ peer
    ○ accessor
    3. 使ってみた感想
    © 2023 Wantedly, Inc.

    View Slide

  4. Swift Macros とは
    © 2023 Wantedly, Inc.

    View Slide

  5. Swift Macros
    ● ソースコードのコンパイル時にコードを変換し、繰り返し書く手
    間を省く
    ● Swift では 2 種類のマクロがある
    ○ Freestanding macros
    ■ 引数のみに依存して独立して展開される
    ■ #function, #warning
    ○ Attached macros
    ■ 宣言に付属して対象の情報を利用して展開される
    ■ @Observation
    © 2023 Wantedly, Inc.
    https://docs.swift.org/swift-book/documentation/the-swift-
    programming-language/macros/

    View Slide

  6. Swift Macros
    ● ソースコードのコンパイル時にコードを変換し、繰り返し書く手
    間を省く
    ● Swift では 2 種類のマクロがある
    ○ Freestanding macros
    ■ 引数のみに依存して独立して展開される
    ■ #function, #warning
    ○ Attached macros
    ■ 宣言に付属して対象の情報を利用して展開される
    ■ @Observation
    © 2023 Wantedly, Inc.
    https://docs.swift.org/swift-book/documentation/the-swift-
    programming-language/macros/

    View Slide

  7. アプリの紹介
    © 2023 Wantedly, Inc.

    View Slide

  8. 開発中のアプリの紹介
    ● Swift 5.9, iOS17 SDK の機能
    を色々試してみる環境
    ● Apple のドキュメントブラウザア
    プリ
    © 2023 Wantedly, Inc.
    https://github.com/swiftty/apple-documentation

    View Slide

  9. public init
    © 2023 Wantedly, Inc.

    View Slide

  10. public init
    ● ドキュメントデータの構造の数だ
    け型を用意
    ● マルチモジュール構成で開発し
    ているため public init が
    全てに必要…
    ○ Macro で楽をしたい
    © 2023 Wantedly, Inc.

    View Slide

  11. @attached(member)
    ● member
    ○ 型に対してアタッチすることができる Macro
    ○ 引数の declaration からプロパティなどのメンバー情報を取得
    ● →プロパティ定義を収集して init を生成
    © 2023 Wantedly, Inc.

    View Slide

  12. ImplicitInitMacro
    ● members: MemberBlockItemListSyntax から
    各プロパティの名前、型、初期値を取り出す
    © 2023 Wantedly, Inc.

    View Slide

  13. ImplicitInitMacro
    ● variables から引数リストを構築
    ○ init(FunctionParameterListSyntax)
    ○ foo: Foo? = nil を組み立て
    © 2023 Wantedly, Inc.

    View Slide

  14. ImplicitInitMacro
    ● init を構築
    ○ init() { for-loop }
    ○ self.foo = foo を組み立て
    © 2023 Wantedly, Inc.

    View Slide

  15. EnvironmentKey
    © 2023 Wantedly, Inc.

    View Slide

  16. EnvironmentKey
    ● SwiftUI の EnvironmentKey を定義する際に定型文が頻

    © 2023 Wantedly, Inc.

    View Slide

  17. EnvironmentKey
    ● SwiftUI の EnvironmentKey を定義する際に定型文が頻

    © 2023 Wantedly, Inc.
    このように書きたい

    View Slide

  18. @attached(peer), @attached(accessor)
    ● peer
    ○ 任意の宣言と並べて新たな定義を用意できる Macro
    ■ @AddAsync のようにメソッドを追加させたいときなど
    ● accessor
    ○ プロパティの getter, setter を生成できる Macro
    © 2023 Wantedly, Inc.

    View Slide

  19. SwiftUIEnvironmentMacro
    ● peer マクロで EnvironmentKey に適合する型を生成
    ○ 返却する Syntax は ExpressibleByStringInterpolation に
    適合しているので文字列で実装することも可能
    © 2023 Wantedly, Inc.

    View Slide

  20. SwiftUIEnvironmentMacro
    ● accessor マクロも同様に getter と setter の Syntax を
    生成
    ○ peer で生成される型を参照
    © 2023 Wantedly, Inc.

    View Slide

  21. Tips
    © 2023 Wantedly, Inc.

    View Slide

  22. Tips
    ● Swift AST Explorer がやっぱり便利
    ○ https://swift-ast-explorer.com/
    ○ どこでどの Syntax が現れるかを確認し
    て、キャストするため
    ● SwiftSyntaxMacrosTestSupport
    の assertMacroExpansion も期待
    する生成結果かどうか確認しやすい
    © 2023 Wantedly, Inc.

    View Slide

  23. 感想
    ● ボイラープレートで煩雑に感じていたコードがマクロでスッキ
    リするのは良い体験
    ● resultBuilder や ExpressibleByStringInterpolation
    のサポートで直感的に追加するコードを書ける
    ● dependency に swift-syntax が必要
    ○ 3rd party の Macro ライブラリだと微妙にニーズが満たせなかった
    り swift-syntax によって依存関係がシビアになりがちなので、しば
    らく自作が良さそう
    © 2023 Wantedly, Inc.

    View Slide