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
だったら、俺が代わりにやってやる / Swift Zoomin' Challenge
Search
Hiron
May 16, 2020
Programming
0
140
だったら、俺が代わりにやってやる / Swift Zoomin' Challenge
Swift Zoomin' の Fat View Controllerを倒せ! 報告会の発表スライドです。
Hiron
May 16, 2020
Tweet
Share
More Decks by Hiron
See All by Hiron
try! Swift Tokyo 2024 参加報告 / try! Swift Tokyo 2024 Report
hironytic
0
380
Swift on Windows ファーストインプレッション / Swift on Windows First Impression
hironytic
0
610
iPadOSDC: Multiple Windows
hironytic
4
3k
SwiftのNeverとボトム型 / Never as a Bottom Type
hironytic
2
800
4000のワーニングと戦え!これは警告だ! / 4000 Warnings
hironytic
2
780
シンボリケート / Ore-con 2018 Summer
hironytic
3
1k
全部iOSにしゃべらせちゃえ! / iOSDC 2018 LT
hironytic
3
1.5k
ペダルのある生活 / The Pedal
hironytic
0
410
Cloud Firestore(の、スタブ)を作ってみた / Stubbing Cloud Firestore
hironytic
1
740
Other Decks in Programming
See All in Programming
これでLambdaが不要に?!Step FunctionsのJSONata対応について
iwatatomoya
2
3.7k
採用事例の少ないSvelteを選んだ理由と それを正解にするためにやっていること
oekazuma
2
1k
From Translations to Multi Dimension Entities
alexanderschranz
2
130
短期間での新規プロダクト開発における「コスパの良い」Goのテスト戦略」 / kamakura.go
n3xem
2
170
Jakarta EE meets AI
ivargrimstad
0
260
テストコード書いてみませんか?
onopon
2
130
開発者とQAの越境で自動テストが増える開発プロセスを実現する
92thunder
1
190
創造的活動から切り拓く新たなキャリア 好きから始めてみる夜勤オペレーターからSREへの転身
yjszk
1
130
Effective Signals in Angular 19+: Rules and Helpers
manfredsteyer
PRO
0
110
なまけものオバケたち -PHP 8.4 に入った新機能の紹介-
tanakahisateru
1
120
Security_for_introducing_eBPF
kentatada
0
110
Kaigi on Railsに初参加したら、その日にLT登壇が決定した件について
tama50505
0
100
Featured
See All Featured
Designing Dashboards & Data Visualisations in Web Apps
destraynor
229
52k
jQuery: Nuts, Bolts and Bling
dougneiner
61
7.5k
Exploring the Power of Turbo Streams & Action Cable | RailsConf2023
kevinliebholz
28
4.4k
GitHub's CSS Performance
jonrohan
1030
460k
Building an army of robots
kneath
302
44k
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
132
33k
Fashionably flexible responsive web design (full day workshop)
malarkey
405
66k
Done Done
chrislema
181
16k
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
232
17k
The Art of Programming - Codeland 2020
erikaheidi
53
13k
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
29
2.3k
Speed Design
sergeychernyshev
25
670
Transcript
ͩͬͨΒɺԶ͕ ΘΓʹͬͯΔʂ 4XJGU;PPNJOνϟϨϯδʙ'BU7JFX$POUSPMMFSΛͤʂʙ ใࠂձ
"CPVU.F w ͻΖΜʢҰٶߒڭʣ w 5XJUUFS(JU)VC2JJUB 4MJEF4IBSF4QFBLFS%FDL ˠIJSPOZUJD w ಙౡࡏॅ w
ීஈ'BU7JFX$POUSPMMFS ͱઓΘͣʹɺͲ͏͖߹ͬ ͍͔ͯ͘Λߟ͍͑ͯ·͢
Ͱ͖͕͋ͬͨͷ w IUUQTHJUIVCDPNIJSPOZUJDSFWFSTJJPT w ΞʔΩςΫνϟύλʔϯɿ .77. 3FEVY w ༻ϑϨʔϜϫʔΫɿ 6*,JUɺ$PNCJOF
ϦϑΝΫλϦϯάΛ ͲͷΑ͏ʹਐΊ͍͔ͯͬͨ
νϟϨϯδ ͷࣗͷϝϞ w σΟεΫຕΧϯτcountDisks(of:) w σΟεΫຕͷଟ͍ํΛฦ͢sideWithMoreDisks() w σΟεΫΛஔ͚Δ͔Ͳ͏͔ௐΔcanPlaceDisk(_:atX:y:)
w σΟεΫΛஔ͚ΔॴΛฦ͢validMoves(for:) w σΟεΫΛஔ͘placeDisk(_:atX:y:animated:completion:)
νϟϨϯδʙཌ #PBSE7JFX 7JFX $POUSPMMFS ˣ͜ͷ࣌ͷϘʔυ #PBSE ϓϩτίϧ ʢ˞ҙຯͳ͔ͬͨʣ 3FWFSTJ -PHJDT
FYUFOTJPO ˞placeDisk()Ξχϝʔ γϣϯͷΩϟϯηϧॲཧΛ ViewController͕͍࣋ͬͯ ͨΓͯ͠ɺ͍ͼͭͳঢ়ଶ IUUQTHJUIVCDPNIJSPOZUJDSFWFSTJJPTQVMM
ಘΒΕͨͷ w ʮͳΜ͔ͬͨͬͨʯͱ͍͏ຬײ
Ϧόʔγ൫ΛϞσϧͱϏϡʔʹ ͷࣗͷϝϞ BoardView ͍࣋ͬͯΔػೳ 3FWFSTJ-PHJDT ͷػೳ struct CellChange: Hashable {
var x: Int var y: Int var disk: Disk? } struct Board { ... mutating func placeDisk(_ disk: Disk, atX x: Int, y: Int) throws -> [CellChange] { ... } } IUUQTHJUIVCDPNIJSPOZUJDSFWFSTJJPTQVMM
ಘΒΕͨͷ w Ϙʔυͷঢ়ଶͱը໘ΛΓͤͨ w Ϧόʔγͷϧʔϧʹجͮ͘มߋ͔͠ߦ͑ͳ͍҆શ ੑʢྫ͑ͻͬ͘ΓฦΒͳ͍ͱ͜ΖʹσΟεΫΛ ஔ͘͜ͱͰ͖ͳ͍ʣ w 3FWFSTJ-PHJDTͷςετίʔυ
ήʔϜਐߦΛ͍͕ͨ͠ʜ w ͳΜͱͳ͘.77. w ϘʔυҎ֎ͷ6*ͷଘࡏ ΛΕ͍ͯΔ w ਐߦͷྲྀΕ͕ཧͰ͖ͯ ͍ͳ͍ w
ΞχϝʔγϣϯΞϥʔ τ7JFXͷͱߟ ͍͑ͯΔ ͷࣗͷϝϞ
ήʔϜਐߦͷྲྀΕΛཧ ͷࣗͷϝϞ
ը໘ 7JFX ͷೖग़ྗཧ ͷࣗͷϝϞ
ήʔϜͷہ໘͕ঢ়ଶભҠ͢Δͱߟ͑ͨ ͷࣗͷϝϞ
ঢ়ଶભҠͱ͍͑ʜ3FEVY ͷࣗͷϝϞ .PEFM 7JFX 7JFX.PEFM 3FEVY
Ϟσϧͷ෦Λ3FEVY෩ʹ࣮ w ΊͬͪΌࢼߦࡨޡͨ͠ 3FEVYࣝͱ͍͚ͯͬͯͨͩͩͬͨ͠ʢ'MVYܦݧ͋Γʣ
ϑΣʔζͱ͍͏ಠࣗ֓೦ public protocol Reducer { /// ΞΫγϣϯʹԠͯ͡ঢ়ଶΛมߋ͠·͢ɻ /// - Parameters:
/// - state: มߋલͷঢ়ଶͰ͢ɻ /// - action: ঢ়ଶมߋΛཁٻ͢ΔΞΫγϣϯͰ͢ɻ /// - Returns: มߋޙͷঢ়ଶΛฦ͠·͢ɻ static func reduce(state: State, action: Action) -> State } public protocol Phase: Reducer, Hashable, CustomStringConvertible { /// ϑΣʔζछผͰ͢ɻ var kind: PhaseKind { get } /// ผͷϑΣʔζ͔Β͜ͷϑΣʔζʹભҠ͢Δͱ͖ʹݺΕ·͢ɻ /// ඞཁʹԠͯ͡αϯΫΛฦ͢͜ͱ͕Ͱ͖·͢ɻ /// - Parameters: /// - previousPhase: ҎલͷϑΣʔζ͕͞Ε·͢ɻ static func onEnter(previousPhase: AnyPhase) -> Thunk? /// ͜ͷϑΣʔζ͔ΒผͷϑΣʔζʹભҠ͢Δͱ͖ʹݺΕ·͢ɻ /// ඞཁʹԠͯ͡αϯΫΛฦ͢͜ͱ͕Ͱ͖·͢ɻ /// - Parameters: /// - state: ݱࡏͷঢ়ଶͰ͢ɻ /// - nextPhase: ࣍ͷϑΣʔζ͕͞Ε·͢ɻ static func onExit(nextPhase: AnyPhase) -> Thunk? } ͷࣗͷϝϞ
Ϟσϧͷ෦Λ3FEVY෩ʹ࣮ w ΊͬͪΌࢼߦࡨޡͨ͠ 3FEVYࣝͱ͍͚ͯͬͯͨͩͩͬͨ͠ʢ'MVYܦݧ͋Γʣ w ຊՈ3FEVYͷαΠτͱɺؔ࿈ٕज़Λݟͨ͠Γ ‣ IUUQTSFEVYKTPSH ‣
IUUQTHJUIVCDPNSFEVYKTSFEVYUIVOL ‣ IUUQTHJUIVCDPNSFEVYMPPQSFEVYMPPQ w ΊͬͪΌษڧʹͳΓ·ͨ͠ɹʜ͕͋·Γग़དྷʹࣗ৴ͳ͍
Ϟσϧͷ෦ͷ࣮͕ͻͱͱ͓ΓऴΘΓʜ ΄Μͷগ͠ςετίʔυΛॻ͍ͯಈ࡞Λ֬ೝ Γͷςετ͍ͬͨΜอཹͯ͠ɺ7JFX.PEFMͷ࣮ʹ IUUQTHJUIVCDPNIJSPOZUJDSFWFSTJJPTQVMM
7JFX.PEFMΛ࣮ɺͦͯ͠ʜ 7JFX$POUSPMMFSͱଓ IUUQTHJUIVCDPNIJSPOZUJDSFWFSTJJPTQVMM
࣮ࡍʹಈ͔ͤͯ༡Δ
ಾػೳͷര w ஔ͚ͳ͍ͱ͜Ζʹஔ͜͏ͱ͢Δͱ w ίϯϐϡʔλʔ͕উखʹߟ͑ͯஔ͍ ͯ͘ΕΔ w ʮͩͬͨΒɺ ɹԶ͕ΘΓʹͬͯΔʂʯػೳ ʢ˞όάʣ
ϞσϧͷςετΛॆ࣮ͤ͞Δ w ঢ়ଶભҠਤΛॻ ͖ͳ͓ͨ͠ w ͜ΕΛݟͳ͕Β ςετέʔεΛ ࡞ͬͨ ʙͷࣗͷϝϞ
ʮͩͬͨΒɺԶ͕ΘΓʹͬͯΔʯػೳ
.PEFMͱ7JFX.PEFMͱͷࠩ w .PEFMʹ7JFXͷߏΛҙࣝͨ͠4UBUF͍࣋ͨͤͯͳ ͍ʢྫɿλʔϯදࣔউഊදࣔʹ %JTL7JFXΛ͏ͳͲʣ w 7JFX.PEFM7JFXͷߏΛڧ͘ҙࣝͯ͠ɺͳΔͦ͘ͷ ··όΠϯσΟϯάͰ͖ΔΑ͏ʹσʔλΛՃ w 7JFXͱ7JFX.PEFMΛ͚Δҙຯʁ
ˠςετ͕ॻ͚Δ 7JFX.PEFMͷςετΛॻ͍͍ͯͳ͔ͬͨ
ָ͍͠(8Λ ա͢͜͝ͱ͕Ͱ͖·ͨ͠
͝ਗ਼ௌ͋Γ͕ͱ͏͟͝·ͨ͠