【ハイブリット開催】Mobile勉強会 Wantedly × チームラボ #11 https://wantedly.connpass.com/event/297601/
で発表した資料です
© 2023 Wantedly, Inc.個人開発アプリでのSwift Macros 紹介Mobile勉強会 Wantedly × チームラボ #11Oct. 17 2023 - 林達也
View Slide
自己紹介© 2023 Wantedly, Inc.
Agenda1. Swift Macros とは2. 開発中のアプリでの利用例○ member○ peer○ accessor3. 使ってみた感想© 2023 Wantedly, Inc.
Swift Macros とは© 2023 Wantedly, Inc.
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/
アプリの紹介© 2023 Wantedly, Inc.
開発中のアプリの紹介● Swift 5.9, iOS17 SDK の機能を色々試してみる環境● Apple のドキュメントブラウザアプリ© 2023 Wantedly, Inc.https://github.com/swiftty/apple-documentation
public init© 2023 Wantedly, Inc.
public init● ドキュメントデータの構造の数だけ型を用意● マルチモジュール構成で開発しているため public init が全てに必要…○ Macro で楽をしたい© 2023 Wantedly, Inc.
@attached(member)● member○ 型に対してアタッチすることができる Macro○ 引数の declaration からプロパティなどのメンバー情報を取得● →プロパティ定義を収集して init を生成© 2023 Wantedly, Inc.
ImplicitInitMacro● members: MemberBlockItemListSyntax から各プロパティの名前、型、初期値を取り出す© 2023 Wantedly, Inc.
ImplicitInitMacro● variables から引数リストを構築○ init(FunctionParameterListSyntax)○ foo: Foo? = nil を組み立て© 2023 Wantedly, Inc.
ImplicitInitMacro● init を構築○ init() { for-loop }○ self.foo = foo を組み立て© 2023 Wantedly, Inc.
EnvironmentKey© 2023 Wantedly, Inc.
EnvironmentKey● SwiftUI の EnvironmentKey を定義する際に定型文が頻発© 2023 Wantedly, Inc.
EnvironmentKey● SwiftUI の EnvironmentKey を定義する際に定型文が頻発© 2023 Wantedly, Inc.このように書きたい
@attached(peer), @attached(accessor)● peer○ 任意の宣言と並べて新たな定義を用意できる Macro■ @AddAsync のようにメソッドを追加させたいときなど● accessor○ プロパティの getter, setter を生成できる Macro© 2023 Wantedly, Inc.
SwiftUIEnvironmentMacro● peer マクロで EnvironmentKey に適合する型を生成○ 返却する Syntax は ExpressibleByStringInterpolation に適合しているので文字列で実装することも可能© 2023 Wantedly, Inc.
SwiftUIEnvironmentMacro● accessor マクロも同様に getter と setter の Syntax を生成○ peer で生成される型を参照© 2023 Wantedly, Inc.
Tips© 2023 Wantedly, Inc.
Tips● Swift AST Explorer がやっぱり便利○ https://swift-ast-explorer.com/○ どこでどの Syntax が現れるかを確認して、キャストするため● SwiftSyntaxMacrosTestSupportの assertMacroExpansion も期待する生成結果かどうか確認しやすい© 2023 Wantedly, Inc.
感想● ボイラープレートで煩雑に感じていたコードがマクロでスッキリするのは良い体験● resultBuilder や ExpressibleByStringInterpolationのサポートで直感的に追加するコードを書ける● dependency に swift-syntax が必要○ 3rd party の Macro ライブラリだと微妙にニーズが満たせなかったり swift-syntax によって依存関係がシビアになりがちなので、しばらく自作が良さそう© 2023 Wantedly, Inc.