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
380
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
350
良いテストコードのために悪いテストコードを理解する - 不安定なテスト編: 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
マイコン向けの軽量Ruby「PicoRuby」で各種デバイスを制御するネイティブアプリの実現手法
bash0c7
0
460
技術的負債を組織課題として解く-増えすぎたマイクロサービスとの戦い-
reimaru
1
2.6k
TiDB Cloudのカスタムコントローラーによるオートスケール対応
takaidohigasi
0
140
App Intentsのビルドプロセスを支える技術
kntkymt
0
490
App Storeの外へ──日本のiOSサイドローディング入門 for iOSDC Japan 2026
yuukiw00w
0
280
[ハンズオン]AIへの指示だけで「五目並べ」を作ってみよう
satoshi256kbyte
1
310
AI が書く Go コードの品質を劇的に向上させる Linter: “declscope”
mpyw
0
460
モデルのリファクタリングが難しいと思ったら、そもそも複雑だったのはビジネス仕様だった ? / is-the-business-domain-the-real-complexity
hatsu38
0
430
Augmenting AI with the Power of Jakarta EE
ivargrimstad
0
370
コードレビューのボトルネックを"する側"と"される側"の両面から解消する
yub0n
2
1.2k
Everything will be SERVERLESS — 信じて運用した10年の経験値 / Everything Will be Serverless — Lessons Learned from 10 Years of Operational Experience
seike460
PRO
1
650
市販E-Readerを乗っ取れ 〜Embedded Swiftで電子ペーパーガジェットを制御する〜
trickart
0
230
Featured
See All Featured
My Coaching Mixtape
mlcsv
0
330
Information Architects: The Missing Link in Design Systems
soysaucechin
1
1.2k
Lessons Learnt from Crawling 1000+ Websites
charlesmeaden
PRO
1
1.6k
エンジニアに許された特別な時間の終わり
watany
109
250k
[SF Ruby Conf 2025] Rails X
palkan
3
1.4k
Paper Plane
katiecoart
PRO
4
53k
Site-Speed That Sticks
csswizardry
13
1.5k
The Illustrated Guide to Node.js - THAT Conference 2024
reverentgeek
1
550
Kristin Tynski - Automating Marketing Tasks With AI
techseoconnect
PRO
0
530
Gemini Prompt Engineering: Practical Techniques for Tangible AI Outcomes
mfonobong
2
560
Ecommerce SEO: The Keys for Success Now & Beyond - #SERPConf2024
aleyda
1
2.2k
Utilizing Notion as your number one productivity tool
mfonobong
4
610
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のリソース