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
400
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
41
Generating DocC with AI
elmetal
PRO
0
73
A Swift Way to Blog
elmetal
PRO
0
210
Designing DocC for Clarity and Beauty
elmetal
PRO
0
140
SwiftUI Viewの責務分離
elmetal
PRO
2
540
サイボウズiOSアプリのマルチモジュール 2024
elmetal
PRO
0
150
開発を加速する共有Swift Package実践
elmetal
PRO
0
1.4k
Resolve Nested ObservableObject issues in Observation
elmetal
PRO
0
450
「サイボウズ Office」 の iOSアプリをリニューアルした話 / Renewal "Cybozu Office" iOS App
elmetal
PRO
0
780
Other Decks in Programming
See All in Programming
Kiroで創り、AgentCoreで繋ぐ!AWSで実践する「AI-DLC」から「AIエージェント統合」までの最新地図
licux
2
270
GKE アップグレード前に知っておきたい Blue/Green と PDB の関係
stkk
0
140
XHTMLが残したもの
yosuke_furukawa
PRO
1
380
AI時代に学ぶ 好きなルール 嫌いなルール Linter編
shorty5121
0
810
Vibes Containers 〜AIで変わるコンテナ設計と運用〜
tkikuc
1
460
Seeing Through Serverless: Observability for AWS Lambda with ADOT and CloudWatch Application Signals
seike460
PRO
1
120
AWS Step Functions 大規模並列の壁を越える / jaws-sonic-2026-niigata-step-functions
kasacchiful
PRO
0
310
Swift愛好会と私(ウホーイ) / Swift Fan Club and Uhooi
uhooi
0
120
AIの中の人になってみる
htkym
0
150
PyConJP2026_wat_Python × Signal Processing: How to Draw Pictures with Sound Using Spectrogram Art
wat
0
660
【デモ】Kiroで体験する仕様駆動開発|設計からコーディングまでAIと進める開発フロー
cmkudo
0
560
ハーネス設計入門 〜プロンプト、コンテキストの次〜
kinopeee
53
35k
Featured
See All Featured
How GitHub (no longer) Works
holman
316
150k
Google's AI Overviews - The New Search
badams
0
1.6k
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
35
2.8k
Automating Front-end Workflow
addyosmani
1369
210k
Test your architecture with Archunit
thirion
2
2.4k
Measuring Dark Social's Impact On Conversion and Attribution
stephenakadiri
2
270
A better future with KSS
kneath
240
18k
Conquering PDFs: document understanding beyond plain text
inesmontani
PRO
4
3k
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
234
17k
Mobile First: as difficult as doing things right
swwweet
225
10k
So, you think you're a good person
axbom
PRO
2
2.1k
Evolution of real-time – Irina Nazarova, EuRuKo, 2024
irinanazarova
9
1.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