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
yimajo
August 20, 2026
Programming
390
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
930
いま中途半端なSwift 6対応をするより、Default ActorやApproachable Concurrencyを有効にしてからでいいんじゃない?
yimajo
2
750
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
【加筆修正版】Laravel のアプリケーションをどこにデプロイするか #phpcon_ehime
akase244
0
100
Herb in Rails 8.2: Your ERB views, now HTML-aware @ Rails World 2026, Austin, Texas
marcoroth
0
160
モデルのリファクタリングが難しいと思ったら、そもそも複雑だったのはビジネス仕様だった ? / is-the-business-domain-the-real-complexity
hatsu38
0
440
setup-vp GitLab対応の裏側
naokihaba
0
150
AHC070解法紹介
eijirou
0
150
AWS CDKのカスタムリソースでContinuum(旧Security Agent)を実装した話 | Implementing Continuum (formerly Security Agent) via AWS CDK Custom Resource
akihisaikeda
2
120
仕様駆動開発による爆速プロダクト開発 / Bakusoku Spec Driven Development
kobakei
0
170
速く作れる。その次は、速く確かめられる開発へ 〜AIネイティブ開発を支える、Shift Down〜 / Can build fast. Next, moving to development where we can verify fast.
rkaga
8
5.4k
選挙速報を多くのユーザーへ 届ける Live Activities 設計
hamayokokuririn
0
230
App Storeの外へ──日本のiOSサイドローディング入門 for iOSDC Japan 2026
yuukiw00w
0
290
コードレビューのボトルネックを"する側"と"される側"の両面から解消する
yub0n
2
1.4k
C#の現在地 進化の歴史と、AI時代の.NET Everywhere
neuecc
5
4.9k
Featured
See All Featured
DBのスキルで生き残る技術 - AI時代におけるテーブル設計の勘所
soudai
PRO
68
58k
CSS Pre-Processors: Stylus, Less & Sass
bermonpainter
360
31k
The Art of Delivering Value - GDevCon NA Keynote
reverentgeek
16
2.2k
Chrome DevTools: State of the Union 2024 - Debugging React & Beyond
addyosmani
10
1.4k
10 Git Anti Patterns You Should be Aware of
lemiorhan
PRO
659
62k
Leo the Paperboy
mayatellez
10
2.3k
Exploring the relationship between traditional SERPs and Gen AI search
raygrieselhuber
PRO
3
4.3k
A designer walks into a library…
pauljervisheath
211
25k
The Myth of the Modular Monolith - Day 2 Keynote - Rails World 2024
eileencodes
28
3.7k
Speed Design
sergeychernyshev
33
2.1k
[Rails World 2026] Durable orchestration on Rails: from continuation to workflow
palkan
1
440
Principles of Awesome APIs and How to Build Them.
keavy
128
18k
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のリソース