Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
片田舎のおっさん、 Swift Buildのダイアモンド問題解決の不具合修正PRを出すが、解決...
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
yimajo
August 20, 2026
Programming
400
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
片田舎のおっさん、 Swift Buildのダイアモンド問題解決の不具合修正PRを出すが、解決方法がキャッシュをしないようにすることであり、ビルド時間が伸びると言われてマージされないので高速化もする/swiftbuild
https://potatotips.connpass.com/event/400003/
yimajo
August 20, 2026
More Decks by yimajo
See All by yimajo
OSSとなったswift-buildで Xcodeのビルドを差し替えられるため 自分でXcodeを直せる時代になっている ダイアモンド問題編
yimajo
3
950
いま中途半端なSwift 6対応をするより、Default ActorやApproachable Concurrencyを有効にしてからでいいんじゃない?
yimajo
2
770
11年かかって やっとVibe Codingに 時代が追いつきましたね
yimajo
1
410
iOSアプリ開発で 関数型プログラミングを実現する The Composable Architectureの紹介
yimajo
3
360
良いテストコードのために悪いテストコードを理解する - 不安定なテスト編: iOSアプリ開発ユニットテストの場合
yimajo
22
6.9k
TCAの Shared Stateって どういう仕組みになってんの?
yimajo
0
2.8k
Swift 5.9 からの Observation はiOS17 未満 からも使えて struct の変更検知もできるんすかね?
yimajo
2
1.2k
不安定なテストは200種類あんねん
yimajo
3
1.3k
TCA v0.19.0からのSwitchStore/CaseLetが良い
yimajo
0
2.1k
Other Decks in Programming
See All in Programming
AI時代のTerminal環境を UNIX哲学で設計・運用する
yasunori0418
1
150
Apple Intelligence を用いた個人情報誤送信防止、及びユーザーリクエスト体験の改善について
yukiny
0
360
AWS CDKのカスタムリソースでContinuum(旧Security Agent)を実装した話 | Implementing Continuum (formerly Security Agent) via AWS CDK Custom Resource
akihisaikeda
2
160
Optunaを作ったときにやりたかったこと、その後 (2026/10/16, Optuna Meetup #3)
iwiwi
2
1.2k
Lambda durable functionsでHuman in the Loopを楽に…楽に……
har1101
1
160
dotNET_vulnclicker_intro.pdf
deka_morita
0
150
[JA] Domain Modeling with Vanilla Rails: 「操作」から再考するRailsの設計論
yasaichi
3
720
自作Discord音声botをLambda MicroVMsに移行した話 / Migrating My Discord Voice Bot to Lambda MicroVMs
akihisaikeda
0
140
3回つくってわかった、 定期実行ジョブ基盤の本質情報
takai
0
600
ソニーのクラウド共通基盤の変遷とAI時代の開発スタイルに合わせた進化 / The Journey of Sony’s Common Cloud Platform and Its Evolution for AI-Native Development
kenjiyoneyama
0
290
Workers Cache を知る
syumai
0
370
golang-bob.pdf
iwatsukayura
0
130
Featured
See All Featured
The Illustrated Children's Guide to Kubernetes
chrisshort
51
53k
What does AI have to do with Human Rights?
axbom
PRO
1
2.5k
A designer walks into a library…
pauljervisheath
211
25k
Six Lessons from altMBA
skipperchong
29
4.5k
Data-driven link building: lessons from a $708K investment (BrightonSEO talk)
szymonslowik
1
1.4k
Git: the NoSQL Database
bkeepers
PRO
433
67k
The Illustrated Guide to Node.js - THAT Conference 2024
reverentgeek
1
580
[Rails World 2026] Durable orchestration on Rails: from continuation to workflow
palkan
1
870
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
234
18k
Ethics towards AI in product and experience design
skipperchong
2
440
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
254
22k
End of SEO as We Know It (SMX Advanced Version)
ipullrank
3
4.4k
Transcript
POTATOTIPS #96 片 田 舎 のおっさん、 Swift Buildのダイアモンド問題解決の不具合修正PR を出すが、解決方法がキャッシュをしないようにす ることであり、ビルド時間が伸びると言われてマー
ジされないので高速化もする 片田舎のおっさんこと yimajo BIG 3 PR SQUAT 85kg, BENCH 80kg, DEADLIFT 110 kg
はなしの前提 落ち着く… 前提は良い —-集中
Appleプラットフォーム用のネイティブなビルドはSwift Buildを使う Xcode $ xcodebuild $ swift build OSS llbuild
Swift Build アプリのバイナリ potatotips #96 Swift Compiler
依存関係のダイアモンド問題について 大抵のビルドシステムは モジュールの依存関係がダイアモンド型になるとき、 2経路がそれぞれStaticでないなら、 依存先をDynamic Linkにする。 (逆に経路が両方Staticなら依存先はStatic App Static Feature
A Dynamic Feature B Dynamic Dynamic のままでいい) 「ダイアモンド問題の解決」と言ったりする。 Common CommonはDynamic Linkにしないといけない potatotips #96
ダイアモンド問題の解決できていないなら? もし、Feature AがStaticで、Feature BがDynamic App と固定されていて、CommonがそれぞれStaticとし てLinkされると… Static Feature A
ビルド時にAppはFeatureA経由でCommonをStatic Link Dynamic Feature B Static Static で含んでいて、アプリ起動時にDynamic LinkでFeatureB 経由で別のCommonを呼び出してしまう。 これで、2つのCommonが1アプリに重複して存在してし Common Common まう。 potatotips #96 04
解決した不具合と解決方法 落ち着く… 不具合解決は良い —-集中
Swift Buildの潜在的不具合 App Dynamic固定 Embedded Framework • Step1: top-levelなTargetからダイアモンド判定 •
そしてそれを重複判定しないようにキャッシュ化 • キャッシュ化された子のTargetを判定から外す Dynamic判定 • Step2: その他TargetもDynamic判定 • -> 子が別のTargetから重複しているのに判定から外される Feature X Feature A • 例 判定から外す • Feature AがAppとEmbeddedFrameworkからリンク • Dynamic判定されるが、FeatureAの子Commonは判 定材料から無視される • FeatureXのCommonは2つあるので本来Dynamic判定 すべきだが、判定材料の対象として見つからない Common Common Commonは重複だがもう一方の Commonは存在しないものとさ れDynamic化されない potatotips #96
不具合修正の解決: PR #1424 ワイ「キャッシュの数行を削除することで問題を解 決だ!Pull Request出す」 レビュアー「処理が指数関数的に遅くなるけど、 DFSアルゴリズムに書き換えることはどう思う?」 ワイ「…!」 potatotips
#96
不具合修正の解決: PR #1424 やったこと 1. 不具合が再現するプロジェクトを用意 2. 不具合の再現をテストコードとして用意し失敗を確認 • このテストが成功することを目指す
3. DFS(深さ優先探索)アルゴリズムを調べる • 型を作りそのメソッドにロジックを書く • テストコードを書いておく 4. 上記2種類のテストが成功するように 5. 再現プロジェクトでも不具合起きないようにする potatotips #96
不具合修正の解決: PR #1424 思ったこと • しかし不具合解決と高速化を1つのPRでやりたくないん だけどその理由は差分がわけわからんことになるから • (そもそも既存コードがわけわからんすぎる) •
PRの差分の読みづらさを許容するんかい • こちらはもっとやりたいようにコードを書く • フォーマットはこちらが読み易いようにもする potatotips #96
不具合修正の解決: PR #1424 ワイ「DFS使ったしワイの作りやすいようにした わ!」 マージ potatotips #96
こんな感じを繰り返し現在8個PRを出して6個マージ済み potatotips #96
片田舎のおっさん、 The Swift Programming Language グループの Member になる potatotips #96
感想:マージまでにも学びがある 01 あきらかな問題でも修正と高速化を同じPRで扱うことになる これは自分のやり方と違うけど郷に入っては郷に従うのがいいと思う 02 具体的なアルゴリズムを指定されることがある 依存関係は逆から辿ることで分岐もないので正直議論しても良かったが私には言語力がない 03 1つのPRの変更は1コミットにまとめ、force pushしてって感じ
おそらく、差分の読みやすさとかコミットログとか気にしていない? 自分たちがずっと使っていくAppleの製品へ組み込まれるコード やる意味は大きい…みんなもやっていこう potatotips #96
発表は以上です さらに知りたい人向けの内容 おまけ: 実態の違う同名の型が存在するとどうなる? potatotips #96
知らんのか? potatotips #96
Feature AとBそれぞれからシングルトンを作成しようとすると それぞれ2つできる Feature A static let sharedな何か Feature B
static let sharedな何か この例はCommonへのStatic Linkが2個だけど CommonへStatic LinkがN個かつDynamic LinkがM個という状況でもダメ potatotips #96
2つの経路で取得したインスタンスのキャストが失敗する 2つの別々の経路から取得した型を比べようとすると 一致しないので `error as? Common.Failure` は失敗するし `do { }
catch Common.Failure { }` も失敗する potatotips #96
リソースが2つあったら超無駄 potatotips #96 Feature A Commonのリソース Feature B Commonのリソース