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
ObservationSallowDive
Search
elmetal
PRO
June 21, 2023
Programming
410
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
プロダクトコードからライブラリの境界を見つける
elmetal
PRO
0
68
SwiftUI Text Rendering Deep Dive
elmetal
PRO
0
41
The Integrity of Making: Extending Xcode Previews with MCP
elmetal
PRO
0
46
Generating DocC with AI
elmetal
PRO
0
76
A Swift Way to Blog
elmetal
PRO
0
240
Designing DocC for Clarity and Beauty
elmetal
PRO
0
150
SwiftUI Viewの責務分離
elmetal
PRO
2
540
サイボウズiOSアプリのマルチモジュール 2024
elmetal
PRO
0
160
開発を加速する共有Swift Package実践
elmetal
PRO
0
1.5k
Other Decks in Programming
See All in Programming
Streamlitで実現する自然言語データアプリ開発
ayumu_yamaguchi
1
320
Apple Intelligence を用いた個人情報誤送信防止、及びユーザーリクエスト体験の改善について
yukiny
0
220
thread_parallel_with_free-threaded_Python_and_NumPy.pdf
riku_sakamoto
0
360
Go × SIMDで高速化するベクトル検索 ~ルーフラインモデルでSIMDが効く境界を探れ! ~
po3rin
1
4.7k
海上で動くGoサーバー: goroutineとchannelでさばく航行データストリーム
atsuki_seo
0
990
AHC070解法紹介
eijirou
0
140
速習iPhone Duo対応
yuukiw00w
2
880
UnityでSystem.Net.WebSocketsなWebSocketサーバが動かないのでUnity Monoのコードを覗いてみた / about implementing websocket server with unity mono
drumath2237
1
490
Java 27新機能 / Java 27 new features
kishida
2
180
Intent as Code
shoppingjaws
6
1.1k
Augmenting AI with the Power of Jakarta EE
ivargrimstad
0
340
JPUG勉強会 OSSデータベースの内部構造を理解しよう(第2回)
oga5
0
280
Featured
See All Featured
16th Malabo Montpellier Forum Presentation
akademiya2063
PRO
0
390
The Power of CSS Pseudo Elements
geoffreycrofte
82
6.6k
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
PRO
203
76k
Why Our Code Smells
bkeepers
PRO
340
58k
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
31
3.4k
Jamie Indigo - Trashchat’s Guide to Black Boxes: Technical SEO Tactics for LLMs
techseoconnect
PRO
0
680
Digital Projects Gone Horribly Wrong (And the UX Pros Who Still Save the Day) - Dean Schuster
uxyall
1
3.1k
First, design no harm
axbom
PRO
2
1.3k
Designing Dashboards & Data Visualisations in Web Apps
destraynor
232
55k
jQuery: Nuts, Bolts and Bling
dougneiner
66
8.6k
State of Search Keynote: SEO is Dead Long Live SEO
ryanjones
0
290
[RailsConf 2023] Rails as a piece of cake
palkan
59
7k
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