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
Fat ViewControllerを倒せ! 〜Cocoa MVC への道のり〜 / No M...
Search
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
Elvis Shi
May 30, 2020
Programming
880
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Fat ViewControllerを倒せ! 〜Cocoa MVC への道のり〜 / No More Fat ViewController! ~The path to Cocoa MVC~
Elvis Shi
May 30, 2020
More Decks by Elvis Shi
See All by Elvis Shi
為什麼你並不需要ViewModel / No, you don't need a ViewModel
lovee
1
570
@Environment(\.keyPath)那么好我不允许你们不知道! / atEnvironment keyPath is so good and you should know it!
lovee
0
570
ゼロから始めるPreferenceの実装 / Let's implement Preferences from scratch
lovee
0
160
Kotlin エンジニアへ送る:Swift 案件に参加させられる日に備えて~似てるけど色々違う Swift の仕様 / from Kotlin to Swift
lovee
1
410
個人アプリを2年ぶりにアプデしたから褒めて / I just updated my personal app, praise me!
lovee
0
790
How did I build an Open-Source SwiftUI Toast Library
lovee
1
190
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
460
Other Decks in Programming
See All in Programming
JAWS-UG 東京支部が始める、JAWS-UG支部コラボ / JAWS-UG lunchtime LT Collaboration
y0hgi
0
200
モデルのリファクタリングが難しいと思ったら、そもそも複雑だったのはビジネス仕様だった ? / is-the-business-domain-the-real-complexity
hatsu38
0
450
Ghostty + Neovimで作る 透明でカッコ良い開発環境
j341nono
0
150
パーソナライズPodcastを作った話
repunit11
0
130
技術的負債を組織課題として解く-増えすぎたマイクロサービスとの戦い-
reimaru
1
2.9k
【加筆修正版】Laravel のアプリケーションをどこにデプロイするか #phpcon_ehime
akase244
0
150
RAG の “R” を Swift で覗いてみる 〜「意味から探す」検索の仕組み〜
nao_randd
0
120
ジョジョの世界をXRで再現する
mofurune
0
140
wkhtmltopdfの次どうするか問題2026
willnet
2
1.9k
phperだってパンチカードでコーディングしたい
o0h
PRO
0
230
AI時代のコードレビューは人に向けるな、仕組みに向けろ
texmeijin
5
3.5k
AWS CDKのカスタムリソースでContinuum(旧Security Agent)を実装した話 | Implementing Continuum (formerly Security Agent) via AWS CDK Custom Resource
akihisaikeda
2
140
Featured
See All Featured
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
52
6.1k
The State of eCommerce SEO: How to Win in Today's Products SERPs - #SEOweek
aleyda
2
12k
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
162
16k
What Being in a Rock Band Can Teach Us About Real World SEO
427marketing
0
1.1k
Learning to Love Humans: Emotional Interface Design
aarron
275
41k
Bioeconomy Workshop: Dr. Julius Ecuru, Opportunities for a Bioeconomy in West Africa
akademiya2063
PRO
1
390
Site-Speed That Sticks
csswizardry
13
1.6k
The agentic SEO stack - context over prompts
schlessera
0
970
Digital Ethics as a Driver of Design Innovation
axbom
PRO
1
450
The Success of Rails: Ensuring Growth for the Next 100 Years
eileencodes
47
8.4k
How To Stay Up To Date on Web Technology
chriscoyier
790
250k
Agile Leadership in an Agile Organization
kimpetersen
PRO
0
280
Transcript
'BU7JFX$POUSPMMFSΛͤʂ ʙ$PDPB.7$ͷಓͷΓʙ f o r 4X J G U
;P PN J O Ԇ ઓ
} var employedBy = "YUMEMI Inc." var job = "iOS
Tech Lead" var favoriteLanguage = "Swift" var twitter = "@lovee" var qiita = "lovee" var github = "el-hoshino" var additionalInfo = """ Twitter෮׆ͨ͠ʂ """ final class Me: Developable, Talkable {
IUUQTHJUIVCDPNSFGBDUPSJOHDIBMMFOHFSFWFSTJJPT
طଘϓϩδΣΫτͷ w ϩδοΫ͕༷ʑͳॴʹࠞࡏ͍ͯ͠Δ w ϦηοτϩδοΫ͕BoardViewʹ w ਐߦϩδοΫ͕ViewControllerʹ w ൫αΠζϩδοΫ͕BoardViewʹ w
ΞχϝʔγϣϯϩδοΫ͕ViewControllerʹ
$PDPB.7$ͷߏ 7JFX$POUSPMMFS .PEFM 7JFX ߦಈ ૢ࡞ ௨ ߋ৽
$PDPB.7$ͷߏ w .PEFMɿήʔϜϩδοΫͷॲཧ w 7JFXɿը໘ඳըͱɺϢʔβΞΫγϣϯͷड w 7JFX$POUSPMMFSɿ7JFXͱ.PEFMͷՍ͚ڮ
$PDPB.7$ͷߏ w (BNF&OHJOFɿήʔϜϩδοΫͷॲཧ w #PBSE7JFXɿը໘ඳըͱɺϢʔβΞΫγϣϯͷड w 7JFX$POUSPMMFSɿ#PBSE7JFXͱ(BNF&OHJOFͷ Ս͚ڮ
मਖ਼ํʢίϯϙʔωϯτʣ w (BNF&OHJOFʹશͯͷήʔϜϩδοΫΛू w 7JFX$POUSPMMFSͱ#PBSE7JFXͷήʔϜϩδοΫ Λશͯ(BNF&OHJOFʹҠಈ w #PBSE7JFXʹඳըॲཧͷΈΛ͢ w ήʔϜϧʔϧʹґଘͤͣɺݴΘΕͨ௨Γʹ͢Δ
͚ͩͷඳըϩδοΫ w طଘͷॲཧίʔυࣗମ࠷খݶͷमਖ਼Ͱ
मਖ਼ํʢσʔλϑϩʔʣ w ॲཧͷྲྀΕΛҰຊಓԽ w BoardView͕ϢʔβΞΫγϣϯΛड͚ͨΒ@IBAction ͘͠delegate௨ͯ͠ViewControllerʹୡ w ViewController͕ΒͬͨϢʔβΞΫγϣϯΛݩʹ GameEngineΛૢ࡞ w
GameEngine͕ಠࣗઐ༻εϨουͰૢ࡞Λॲཧ͠ɺͦͷ݁Ռ ΛAnyPublisherͰViewControllerʹ௨ w ViewController͕Βͬͨ݁ՌΛݩʹϝΠϯεϨουͰ BoardViewΛߋ৽ w BoardView͕ͦͷ݁Ռͷ௨Γʹඳը
$PDPB.7$ͷߏ 7JFX$POUSPMMFS .PEFM 7JFX ૢ࡞ ௨ ߋ৽ ߦಈ
$PDPB.7$ͷߏ 7JFX$POUSPMMFS (BNF&OHJOF #PBSE7JFX ૢ࡞ ௨ ߋ৽ ߦಈ
$PDPB.7$ͷߏ 7JFX$POUSPMMFS (BNF&OHJOF #PBSE7JFX reset() setPlayer(_:for:) getPlayer(for:)-> placeDisk(at:) nextMove() currentBoard{get}
saveGame() loadGame() $isThinking $changedDisks $currentTurn $currentCount boardSize{set} changeDisks(at:to:) reset(with:) @pressReset(_:) @changePlayerControl(_:) .didSelectCell(at:) $AnyPublisherͱͯ͠ฦ͞ΕΔ @@IBActionΛ௨ͯ͠ݺΕΔ .delegateΛ௨ͯ͠ݺΕΔ
%&.0
ল w ෦࡞ͬͯॲཧΛҠಈ͢Δલʹɺ͏গ͠ϝιουΛ ࡉ͔͘Γग़͖ͩͬͨ͢ w ॲཧͷҠಈͱϝιουͷΓग़͠ͱςετͷ࣮ͷ ಉ࣌ฒߦ͕ڧ͍ΒΕͯେมͩͬͨ w ͞Βʹͦͷ͍ͤͰ్த͔Βςετॻ͘ͷఘΊͨ
ͦͷଞ w $PDPB.7$ͷߏͷઆ໌͚ͩͳͷͰɺGameEngine ͕·ͩগʑ'BU w GameEngineΛ७ਮؔԽͯ͠ɺ֤छঢ়ଶΛ͞Βʹ GameStoreͱ͔ʹΓग़ͤߋʹ͖Ε͍ʹͳΔ w ͬͺ6*,JUʹͱͬͯ$PDPB.7$ָʂ w
protocolͰ@Published<Value>ͱ͔ΛએݴͰ͖Δ Α͏ʹͯ͠΄͍͠ w ࠓAnyPublisher<Value, Never> { get }Ͱ ఆٛ͢Δ͔͠ͳ͍ͷ͕ඍົʹਏ͍