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
ObservationSallowDive
Search
elmetal
PRO
June 21, 2023
Programming
380
1
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
ObservationSallowDive
elmetal
PRO
June 21, 2023
More Decks by elmetal
See All by elmetal
The Integrity of Making: Extending Xcode Previews with MCP
elmetal
PRO
0
36
Generating DocC with AI
elmetal
PRO
0
65
A Swift Way to Blog
elmetal
PRO
0
180
Designing DocC for Clarity and Beauty
elmetal
PRO
0
120
SwiftUI Viewの責務分離
elmetal
PRO
2
510
サイボウズiOSアプリのマルチモジュール 2024
elmetal
PRO
0
140
開発を加速する共有Swift Package実践
elmetal
PRO
0
1.4k
Resolve Nested ObservableObject issues in Observation
elmetal
PRO
0
430
「サイボウズ Office」 の iOSアプリをリニューアルした話 / Renewal "Cybozu Office" iOS App
elmetal
PRO
0
750
Other Decks in Programming
See All in Programming
Dataformのリポジトリを立ち上げるときにまずやること / dataform-day0-2026
snhryt
0
180
ECSアプリログをFireLensでコスト削減しようとしたけど諦めた話 in Fargate×Node.js
akihisaikeda
2
4.2k
Lemonade + Foundry Toolkit でお手軽アプリ開発
seosoft
1
370
技術記事、 専門家としてのプログラマ、 言語化
mizchi
13
6.5k
並列実装の現場、2ヶ月間実務でAIを使い倒したAIもPCも私も限界が近い
ming_ayami
0
130
Mujeres en SEO Summit 2026 - Greatest Disaster Hits en Web Performance
guaca
0
200
脅威をエンジニアリングの糧にして――現場編 / Turning Threats into Engineering Fuel — Field Edition
nrslib
0
300
TSKaigi Night Talks 2026_TypeScriptでサプライチェーンの整合性を型に閉じ込める
geekplus_tech
0
400
Contextとはなにか
chiroruxx
1
370
Oxlintのカスタムルールの現況
syumai
6
1.1k
Agentic UI
manfredsteyer
PRO
0
190
フロントエンドとバックエンドで「1文字」を揃えよう
youkidearitai
PRO
0
740
Featured
See All Featured
Rails Girls Zürich Keynote
gr2m
96
14k
Noah Learner - AI + Me: how we built a GSC Bulk Export data pipeline
techseoconnect
PRO
0
200
Documentation Writing (for coders)
carmenintech
77
5.4k
What the history of the web can teach us about the future of AI
inesmontani
PRO
1
620
The Organizational Zoo: Understanding Human Behavior Agility Through Metaphoric Constructive Conversations (based on the works of Arthur Shelley, Ph.D)
kimpetersen
PRO
0
370
<Decoding/> the Language of Devs - We Love SEO 2024
nikkihalliwell
1
250
The Web Performance Landscape in 2024 [PerfNow 2024]
tammyeverts
12
1.2k
Tips & Tricks on How to Get Your First Job In Tech
honzajavorek
1
540
DBのスキルで生き残る技術 - AI時代におけるテーブル設計の勘所
soudai
PRO
66
55k
職位にかかわらず全員がリーダーシップを発揮するチーム作り / Building a team where everyone can demonstrate leadership regardless of position
madoxten
62
55k
Chasing Engaging Ingredients in Design
codingconduct
0
230
The Myth of the Modular Monolith - Day 2 Keynote - Rails World 2024
eileencodes
28
3.5k
Transcript
0CTFSWBUJPO4BMMPX%JWF $ZCP[V.PCJMF.FFUVQ FMNFUBM$ZCP[V *OD
"CPVUNF !FM@NFUBM@ J04"QQ %FWFMPQFS J04ΞϓϦ։ൃ ڝഅ ରઓήʔϜ
8IBUJT0CTFSWBUJPO w ݎ࿚ɾλΠϓηʔϑɾߴύϑΥʔϚϯεͷΦϒβʔόʔύλʔϯΛఏڙ͢Δ w ϓϩύςΟͷมߋΛ͢ΔͨΊͷ৽͍͠4XJGUͷػೳ w 4XJGUͷ௨ৗͷܕͱҰॹʹಈ࡞͠ɺϚΫϩͰม͢Δ w A!0CTFSWBUJPOAΛՃ͢Δ͚ͩͰಈ͘ 0CTFSWBUJPO
8IZ0CTFSWBUJPO
8IZ0CTFSWBUJPO 0UIFSNFDIBOJTNTGPSPCTFSWBUJPOJO4XJGU w ,70 LFZWBMVFPCTFSWJOH w 0CTFSWBCMF0CKFDU
8IZ0CTFSWBUJPO 0UIFSNFDIBOJTNTGPSPCTFSWBUJPOJO4XJGU w ,70 LFZWBMVFPCTFSWJOH ˠ/40CKFDUͷܧঝ͕ඞཁ ˠΠϕϯτͷΠϯλʔηϓτ͔͠ఏڙ͞Εͳ͍ͷͰɺ௨͕XJMM4FUͱEJE4FUͷؒͰߦΘΕΔ
ˠΠϕϯτཻʹॊೈੑ͕͋Δ͕ɺ߹ੑʹ͚ܽΔ ˠ0CKFDUJWF$ϥϯλΠϜʹґଘ͢Δ ˠLFZQBUIͰڧ͍ܕ͚͕͞Ε͍ͯΔʹؔΘΒͣɺ࣮ࡍจࣈྻܕ͚͞Ε͍ͯΔ w 0CTFSWBCMF0CKFDU ˠ%BSXJOͰ͔͑͠ͳ͍ ˠQSFDPODVSSFODZͳ$PNCJOF͕ඞཁ ˠܕͷ४ڌ͚ͩͰͳ͘ɺ؍ଌ͞ΕΔϓϩύςΟʹA!1VCMJTIFEA͕ඞཁ ˠDPNQVUFEQSPQFSUZΛ؍ଌͰ͖ͳ͍ ˠDIBOHFFWFOUͷ։࢝࣌ʹੜ͞ΕΔͷͰɺ৽͍͕͠ઃఆ͞ΕΔલʹશͯͷ͕ྲྀΕΔ
4PMVUJPOTUPQSPCMFNTPUIFSNFDIBOJTNTGPSPCTFSWBUJPO w A!0CTFSWBCMFAΞϊςʔγϣϯͰܕࣗମΛPCTFSWBCMFʹ͢Δ w 0CTFSWBCMFϚΫϩʹΑΓɺϓϩτίϧ४ڌͱϓϩύςΟͷτϥοΩϯάΛ࣮ ͢Δ ˠϓϩύςΟ͝ͱʹݸผͷϚʔΩϯά͕ෆཁ 8IZ0CTFSWBUJPO
6TJOH0CTFSWBUJPO
6TJOH!0CTFSWBCMF 6TJOH0CTFSWBUJPO @Observable class FoodTruckModel { var orders: [Order] =
[] var donuts = Donut.all }
6TJOH!0CTFSWBCMF 6TJOH0CTFSWBUJPO @Observable class FoodTruckModel { var orders: [Order] =
[] var donuts = Donut.all } ΞϊςʔγϣϯҰՕॴ શϓϩύςΟ͕τϥοΩϯάͰ͖Δ
&YQBOE.BDSP 6TJOH0CTFSWBUJPO @Observable class FoodTruckModel { @ObservationTracked var orders: [Order]
= [] @ObservationTracked var donuts = Donut.all @ObservationIgnored private let _$observationRegistrar = ObservationRegistrar() internal nonisolated func access<Member>( keyPath: KeyPath<FoodTruckModel , Member> ) { _$observationRegistrar.access(self, keyPath: keyPath) } internal nonisolated func withMutation<Member, T>( keyPath: KeyPath<FoodTruckModel , Member>, _ mutation: () throws -> T ) rethrows -> T { try _$observationRegistrar.withMutation(of: self, keyPath: keyPath, mutation) } @ObservationIgnored private var _orders: [Order] = [] @ObservationIgnored private var _donuts = Donut.all } extension FoodTruckModel : Observable {}
4XJGU6*QSPQFSUZUSBDLJOH 6TJOH0CTFSWBUJPO @Observable class FoodTruckModel { var orders: [Order] =
[] var donuts = Donut.all } struct DonutMenu: View { let model: FoodTruckModel var body: some View { List { Section("Donuts") { ForEach(model.donuts) { donut in Text(donut.name) } Button("Add new donut") { model.addDonut() } } } } }
4XJGU6*QSPQFSUZUSBDLJOH 6TJOH0CTFSWBUJPO @Observable class FoodTruckModel { var orders: [Order] =
[] var donuts = Donut.all } struct DonutMenu: View { let model: FoodTruckModel var body: some View { List { Section("Donuts") { ForEach(model.donuts) { donut in Text(donut.name) } Button("Add new donut") { model.addDonut() } } } } } Ξϊςʔγϣϯ͕ෆཁ
6TJOH1SPQFSUZ8SBQQFS
6TJOH!4UBUF 6TJOH1SPQFSUZ8SBQQFS struct DonutListView: View { var donutList: DonutList @State
private var donutToAdd: Donut? var body: some View { List(donutList.donuts) { DonutView(donut: $0) } Button("Add Donut") { donutToAdd = Donut() } .sheet(item: $donutToAdd) { TextField("Name", text: $donutToAdd.name) Button("Save") { donutList.donuts.append(donutToAdd) donutToAdd = nil } Button("Cancel") { donutToAdd = nil } } } }
6TJOH!&OWJSPONFOU 6TJOH1SPQFSUZ8SBQQFS @Observable class Account { var userName: String?
} struct FoodTruckMenuView : View { @Environment(Account.self) var account var body: some View { if let name = account.userName { HStack { Text(name); Button("Log out") { account.logOut() } } } else { Button("Login") { account.showLogin() } } } }
6TJOH!#JOEBCMF 6TJOH1SPQFSUZ8SBQQFS @Observable class Donut { var name: String
} struct DonutView: View { @Bindable var donut: Donut var body: some View { TextField("Name", text: $donut.name) } }
4UPSJOH!0CTFSWBCMFUZQFTJO"SSBZ 6TJOH1SPQFSUZ8SBQQFS @Observable class Donut { var name: String
} struct DonutList: View { var donuts: [Donut] var body: some View { List(donuts) { donut in HStack { Text(donut.name) Spacer() Button("Randomize") { donut.name = randomName() } } } } }
3FGFSFODFT
w %JTDPWFS0CTFSWBUJPOJO4XJGU6* IUUQTEFWFMPQFSBQQMFDPNWJEFPTQMBZXXED w "QQMF%FWFMPQFS%PDVNFOUBUJPO0CTFSWBUJPO IUUQTEFWFMPQFSBQQMFDPNEPDVNFOUBUJPO0CTFSWBUJPO 3FGFSFODFT