Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
個人開発アプリでの Swift Macros 紹介
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
swiftty
October 17, 2023
Technology
0
710
個人開発アプリでの Swift Macros 紹介
【ハイブリット開催】Mobile勉強会 Wantedly × チームラボ #11
https://wantedly.connpass.com/event/297601/
で発表した資料です
swiftty
October 17, 2023
Tweet
Share
More Decks by swiftty
See All by swiftty
Wantedly Visit での SKIE の導入と振り返り
swiftty
0
89
iOS 18 から追加された SwiftUI の傾向について調べてみる
swiftty
3
1k
Flutter アプリのリリースフローを考える
swiftty
0
400
Meet BrowserEngineKit
swiftty
0
2.1k
Cloud-managed certificates へ移行した話
swiftty
0
810
同じアプリを Flutter と SwiftUI で書いてみる
swiftty
0
640
Swift Package Manager へ移行した話
swiftty
0
830
SwiftLint にコントリビュートする
swiftty
1
4.7k
SwiftUI でリスト要素のインプレッションを計測する
swiftty
0
650
Other Decks in Technology
See All in Technology
Digitization部 紹介資料
sansan33
PRO
1
7k
Kiro のクレジットを使い切る!
otanikohei2023
0
110
自動テストが巻き起こした開発プロセス・チームの変化 / Impact of Automated Testing on Development Cycles and Team Dynamics
codmoninc
1
1k
型を書かないRuby開発への挑戦
riseshia
0
160
Introduction to Sansan, inc / Sansan Global Development Center, Inc.
sansan33
PRO
0
3k
Windows ネットワークを再確認する
murachiakira
PRO
0
260
ヘルシーSRE
tk3fftk
2
230
トップマネジメントとコンピテンシーから考えるエンジニアリングマネジメント
zigorou
3
520
「データとの対話」の現在地と未来
kobakou
0
1.3k
Agentic Software Modernization - Back to the Roots (Zürich Agentic Coding and Architectures, März 2026)
feststelltaste
1
150
Oracle Base Database Service 技術詳細
oracle4engineer
PRO
15
95k
フルカイテン株式会社 エンジニア向け採用資料
fullkaiten
0
10k
Featured
See All Featured
How to train your dragon (web standard)
notwaldorf
97
6.5k
Optimising Largest Contentful Paint
csswizardry
37
3.6k
How People are Using Generative and Agentic AI to Supercharge Their Products, Projects, Services and Value Streams Today
helenjbeal
1
130
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
PRO
199
73k
Improving Core Web Vitals using Speculation Rules API
sergeychernyshev
21
1.4k
WCS-LA-2024
lcolladotor
0
470
Self-Hosted WebAssembly Runtime for Runtime-Neutral Checkpoint/Restore in Edge–Cloud Continuum
chikuwait
0
380
個人開発の失敗を避けるイケてる考え方 / tips for indie hackers
panda_program
122
21k
Are puppies a ranking factor?
jonoalderson
1
3.1k
How to optimise 3,500 product descriptions for ecommerce in one day using ChatGPT
katarinadahlin
PRO
1
3.5k
Max Prin - Stacking Signals: How International SEO Comes Together (And Falls Apart)
techseoconnect
PRO
0
110
Ruling the World: When Life Gets Gamed
codingconduct
0
160
Transcript
© 2023 Wantedly, Inc. 個人開発アプリでの Swift Macros 紹介 Mobile勉強会 Wantedly
× チームラボ #11 Oct. 17 2023 - 林達也
自己紹介 © 2023 Wantedly, Inc.
Agenda 1. Swift Macros とは 2. 開発中のアプリでの利用例 ◦ member ◦
peer ◦ accessor 3. 使ってみた感想 © 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/
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.