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
Demystify SwiftUI 要約 / Summary of Demystify Swi...
Search
Elvis Shi
June 28, 2021
Programming
740
3
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Demystify SwiftUI 要約 / Summary of Demystify SwiftUI
Elvis Shi
June 28, 2021
More Decks by Elvis Shi
See All by Elvis Shi
為什麼你並不需要ViewModel / No, you don't need a ViewModel
lovee
1
440
@Environment(\.keyPath)那么好我不允许你们不知道! / atEnvironment keyPath is so good and you should know it!
lovee
0
510
ゼロから始めるPreferenceの実装 / Let's implement Preferences from scratch
lovee
0
150
Kotlin エンジニアへ送る:Swift 案件に参加させられる日に備えて~似てるけど色々違う Swift の仕様 / from Kotlin to Swift
lovee
1
390
個人アプリを2年ぶりにアプデしたから褒めて / I just updated my personal app, praise me!
lovee
0
750
How did I build an Open-Source SwiftUI Toast Library
lovee
1
170
SwiftUIで使いやすいToastの作り方 / How to build a Toast system which is easy to use in SwiftUI
lovee
3
1.3k
SwiftUIで二重スクロール作ってみた / When I tried to make a dual-scroll-ish view in SwiftUI
lovee
1
390
Observation のあれこれ / A brief introduction about Observation
lovee
3
440
Other Decks in Programming
See All in Programming
<title><a id="</title>君はこのHTMLをパースできるか"></a></title> #雑LT_study
pizzacat83
0
110
分散システム、なんですぐ死んでしまうん?耐障害性を高めたいあなたのためのレジリエンスパターン入門
mshibuya
7
7.1k
php-fpmのプロセスが枯渇した日-調査・対処・そして本当にやるべきだったこと-
shibuchaaaan
0
160
Prismを使った型安全な暗号化_関数型まつり2026
_fhhmm
0
150
AI がコードを書く時代における新卒エンジニアの仕事風景 (2026) / New Graduate Engineers in the Era of AI Coding (2026)
sushichan044
0
240
壊れたパーサから始める関数型設計と構成的なパーサ #fp_matsuri
raiga0310
2
410
言語を使う側から、作る側へ。 自作 Lisp で得た新たな気づき。
andpad
0
140
Lean は証明の正しさを確認するためだけのツールって思ってませんか?
inoueasei
1
120
変わらないものが、変わるものを決める — 意図駆動開発 × イベントソーシング × イミュータブル | What Doesn't Change Decides What Can — IDD × Event Sourcing × Immutability
tomohisa
0
650
今さら聞けない .NET CLI
htkym
0
150
PHP Application における Kubernetes 内 gRPC 通信
ganchiku
0
560
仕様書を書く前にハーネスを作る - Agent Native開発は「探索を速く、判定を固く」
gotalab555
2
1.1k
Featured
See All Featured
Odyssey Design
rkendrick25
PRO
2
740
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
25
2k
The State of eCommerce SEO: How to Win in Today's Products SERPs - #SEOweek
aleyda
2
11k
GraphQLの誤解/rethinking-graphql
sonatard
75
12k
jQuery: Nuts, Bolts and Bling
dougneiner
66
8.5k
Agile Actions for Facilitating Distributed Teams - ADO2019
mkilby
0
230
Creating an realtime collaboration tool: Agile Flush - .NET Oxford
marcduiker
35
2.5k
Building an army of robots
kneath
306
46k
Accessibility Awareness
sabderemane
1
160
[SF Ruby Conf 2025] Rails X
palkan
2
1.2k
The Director’s Chair: Orchestrating AI for Truly Effective Learning
tmiket
1
220
Lightning Talk: Beautiful Slides for Beginners
inesmontani
PRO
2
610
Transcript
%FNZTUJGZ4XJGU6*ཁ f o r : 6 . & .
* T X J G U G F BU ) " , "5" T X J G U ʙ 8 8 % $ 3F DBQ ʙ
} var employedBy = "YUMEMI Inc." var job = "iOS
Tech Lead" var favoriteLanguage = "Swift" var twitter = "@lovee" var qiita = "lovee" var github = "el-hoshino" var additionalInfo = """ ΠψͰ͕͢ɺԿ͔ʁ """ final class Me: Developable, Talkable {
˞ೣͰྫΛ্͍͛ͯ·͕͢ɺൃදऀΠψͰ͢ɻ
࣌ؒ ҧ͏࣌ؒͷ ಉ͡ೣʁ
࣌ؒ ͦͦ ҧ͏ೣʁ
ࣸਅ͚ͩͰஅ͕Ͱ͖ͳ͍ w ҧ͏ೣͰͱͯࣅͯΔ͔͠Εͳ͍ w ಉ͡ೣͰ࣌ظʹΑͬͯݟ͕ͨҧ͏͔͠Εͳ͍ w அ͢ΔͨΊʹՃͷใ͕ඞཁ w ໊લ w
࠼ w FUD *EFOUJUZ
4XJGU6*Λཧղ͢ΔͨΊͷେϙΠϯτ w *EFOUJUZ w -JGFUJNF w %FQFOEFODZ 4XJGU6*͕͋ͳͨͷࢥ͏௨Γͷಈ࡞Λ͍ͯ͠ͳ͔ͬͨΒɺ େ͜ΕΒͷѻ͍͕ؒҧ͍ͬͯΔ͔Βɻ
*EFOUJUZ w େϙΠϯτͷதͰҰ൪ॏཁ w -JGFUJNF%FQFOEFODZɺ*EFOUJUZ͕͋Δ͔Β ͦ͜Γཱͭ w 4XJGU6*ʹछྨͷ*EFOUJUZ͕͋Δ w &YQMJDJU*EFOUJUZʢ໌ࣔత*%ʣ
w 4USVDUVSBM*EFOUJUZʢߏత*%ʣ
&YQMJDJU*EFOUJUZ w ಈతʹมΘΔϏϡʔʹɺ ΤϯδχΞ͕͚ͭΔ*% w ର͕Identifiable ʹద߹͍ͯ͠ͳ͍߹ *%ͷKeyPathΛࢦఆ ͢Δඞཁ͕͋Δ ForEach(cats,
id: \.name) { cat in Text("\(cat.age)ࡀ") } Explicit Identity
&YQMJDJU*EFOUJUZʹٻΊΒΕΔੑ࣭ w ϢχʔΫੑ w ଞͷରͱඃ͍ͬͯ ͚ͳ͍ w ෆมੑ w ͍ͭɺԿճݺͼग़ͯ͠
มΘ͍͚ͬͯͳ͍ ForEach(cats, id: \.name) { cat in Text("\(cat.age)ࡀ") } Explicit Identity
4USVDUVSBM*EFOUJUZ w ߏʹΑͬͯࣗಈతʹ ͚ΒΕΔ*% w JGจTXJUDIจͷذ ͕͋ͬͨΒҧ͏*%͕ ͚ΒΕΔ Structural Identity
if flag { Text("A") } else { Text("B") }
4USVDUVSBM*EFOUJUZͱͷ͖߹͍ํ w ಉ͡ϏϡʔͳΒɺذΛ ͯ͠ߦ͚ͳ͍ w ذΛͤͣʹ͏·͘ *OFSU.PEJ fi FSͳͲΛ ׆༻
Structural Identity if flag { Text("A") } else { Text("B") } ద༻ͯ͠ϏϡʔͷඳըʹӨڹ͠ͳ͍.PEJ fi FSɻ PQBDJUZ QBEEJOH FUD
ͳͥ*EFOUJUZ͕ॏཁ͔ w "OJNBUJPO͢Δͱ͖ͳͲͷஅࠜڌ w Ҡಈ͖͔͢ΫϩεϑΣʔυ͖͔͢ w Ϗϡʔͷ-JGFUJNFΛܾΊΔࠜڌ w ඞཁͳ͘ͳͬͨΒϝϞϦ͔Βফ͢
-JGFUJNF w 4XJGU6*ͷϏϡʔλΠϓܕ w ϏϡʔλΠϓͨͩͷϏϡʔඳըϨγϐ w ϏϡʔλΠϓͷΠϯελϯεࣗମඇৗʹ໋ w ͔͠͠Ϗϡʔͷੜଘظؒͬͱ͍ w
Ϗϡʔඞཁ͕͋ͬͨΒੜ͞Εɺඞཁͳ͘ͳͬͨΒফ͞ΕΔ w ੜ͞ΕͨΒonAppearɺফ͞ΕͨΒonDisappear͕ݺ ΕΔ w @State@StateObjectϏϡʔ͕ඞཁͳ͘ͳͬͨΒফ ͞ΕΔ
-JGFUJNF fl BHUSVF UBQ ࣌ؒ fl BHGBMTF struct Demo:
View { var flag: Bool var body: some View { if flag { Counter() .background(Color.blue) } else { Counter() .background(Color.red) } } } struct Counter: View { @State private var count = 0 var body: some View { Text("\(count)") .onTapGesture { count += 1 } } } fl BHUSVF ফ͞ΕΔ
-JGFUJNF fl BHUSVF UBQ ࣌ؒ fl BHGBMTF struct Demo:
View { var flag: Bool var body: some View { Counter() .background( flag ? Color.blue : Color.red ) } } struct Counter: View { @State private var count = 0 var body: some View { Text("\(count)") .onTapGesture { count += 1 } } } fl BHUSVF ফ͞Εͳ͍ Dependency
%FQFOEFODZ w %FQFOEFODZͨͩͷϏϡʔͷೖྗ w @State@StateObject͚ͩͰͳ͘ɺ @Bindingͨͩͷvarશͯ%FQFOEFODZ w bodyҎ֎શͯ%FQFOEFODZͱߟ͑ͯͳ͍ w %FQFOEFODZ͕มΘͬͨΒɺͦΕʹඥͮ͘Ϗϡʔ͕
࠶ඳը͞ΕΔ w CPEZ͕ݺΕ࣮ͯߦ͞ΕΔ
%FQFOEFODZ 7JFX 7JFX 7JFX 7JFX %FQFOEFODZ %FQFOEFODZ %FQFOEFODZ
·ͱΊ w *EFOUJUZΛ੍͢Δͷ4XJGU6*Λ੍͢Δ w -JGFUJNFΛҙ͠ͳ͍ͱඞཁͳঢ়ଶ͕ফ͑ͯ͠·͏ w %FQFOEFODZͰ࠷ඳը͢ΔϏϡʔΛநग़͍ͯ͠Δ
ࢀߟ IUUQTEFWFMPQFSBQQMFDPNWJEFPTQMBZXXED