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
swiftty
October 17, 2023
Technology
0
620
個人開発アプリでの 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
47
iOS 18 から追加された SwiftUI の傾向について調べてみる
swiftty
3
680
Flutter アプリのリリースフローを考える
swiftty
0
290
Meet BrowserEngineKit
swiftty
0
1.7k
Cloud-managed certificates へ移行した話
swiftty
0
500
同じアプリを Flutter と SwiftUI で書いてみる
swiftty
0
550
Swift Package Manager へ移行した話
swiftty
0
650
SwiftLint にコントリビュートする
swiftty
1
4.6k
SwiftUI でリスト要素のインプレッションを計測する
swiftty
0
540
Other Decks in Technology
See All in Technology
LangSmith×Webhook連携で実現するプロンプトドリブンCI/CD
sergicalsix
1
210
「クラウドコスト絶対削減」を支える技術—FinOpsを超えた徹底的なクラウドコスト削減の実践論
delta_tech
4
140
Understanding_Thread_Tuning_for_Inference_Servers_of_Deep_Models.pdf
lycorptech_jp
PRO
0
170
MUITにおける開発プロセスモダナイズの取り組みと開発生産性可視化の取り組みについて / Modernize the Development Process and Visualize Development Productivity at MUIT
muit
1
15k
ビズリーチにおけるリアーキテクティング実践事例 / JJUG CCC 2025 Spring
visional_engineering_and_design
1
110
生まれ変わった AWS Security Hub (Preview) を紹介 #reInforce_osaka / reInforce New Security Hub
masahirokawahara
0
440
さくらのIaaS基盤のモニタリングとOpenTelemetry/OSC Hokkaido 2025
fujiwara3
2
350
Connect 100+を支える技術
kanyamaguc
0
190
ゼロからはじめる採用広報
yutadayo
2
490
Tech-Verse 2025 Global CTO Session
lycorptech_jp
PRO
0
1.7k
AI時代の開発生産性を加速させるアーキテクチャ設計
plaidtech
PRO
3
120
怖くない!はじめてのClaude Code
shinya337
0
380
Featured
See All Featured
Raft: Consensus for Rubyists
vanstee
140
7k
How to Create Impact in a Changing Tech Landscape [PerfNow 2023]
tammyeverts
53
2.9k
The World Runs on Bad Software
bkeepers
PRO
69
11k
Designing Experiences People Love
moore
142
24k
The Web Performance Landscape in 2024 [PerfNow 2024]
tammyeverts
8
680
What's in a price? How to price your products and services
michaelherold
246
12k
Building a Modern Day E-commerce SEO Strategy
aleyda
42
7.4k
Fashionably flexible responsive web design (full day workshop)
malarkey
407
66k
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
29
2.7k
Principles of Awesome APIs and How to Build Them.
keavy
126
17k
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
161
15k
A Modern Web Designer's Workflow
chriscoyier
694
190k
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.