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
20180410_iOSLT_SwiftとProtocol-OrientedProgramming
Search
shtnkgm
April 10, 2018
Programming
140
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
20180410_iOSLT_SwiftとProtocol-OrientedProgramming
shtnkgm
April 10, 2018
More Decks by shtnkgm
See All by shtnkgm
Combine入門
shtnkgm
2
320
Property Wrappers
shtnkgm
0
370
Saliency Detection
shtnkgm
0
86
パフォーマンス改善とユニットテスト
shtnkgm
4
1.7k
iOSのコードベースレイアウト
shtnkgm
2
830
20190117_iOSLT_CBLinSwift.pdf
shtnkgm
0
120
SwiftとFunctional Reactive Programming
shtnkgm
0
200
20180710_iOSLT_iOSでDarkModeを実装する
shtnkgm
0
120
20180220_iOSLT_Swiftとオブジェクト間の通知のパターン
shtnkgm
0
170
Other Decks in Programming
See All in Programming
PHPで使える日時の表現と、その知り方 #frontend_phpcon_do
o0h
PRO
0
240
Developing with AI Agents — Codex, Claude Code & Cowork Practical Guide
x5gtrn
PRO
0
1.3k
A2UI という光を覗いてみる
satohjohn
1
130
Vite+ Unified Toolchain for the Web
naokihaba
0
300
ADKを使って簡単にAIエージェントを作ってみよう
k1mu21
0
260
Snowflake Summitでの新機能 CoCo / CoWork / snowflake-summit-2026-overall-what-new-coco
tatsuhiro
1
130
軽量Java基盤の設計 DIコンテナに頼らない、長期保守と1秒起動の実現 JJUG CCC 2026 Spring
macha64
0
510
ローカルLLMでどこまでコードが書けるか -拡張版 / How much code can be written on a local LLM Extended
kishida
10
4.1k
正しくソフトウェアを作る、前提を疑うための認知の視点 / doubt-premise
minodriven
21
6.6k
TypeScript+Orvalで実現する型安全かつ堅牢でスケーラブルなマルチチャネル通知基盤 / TSKaigi Night talks ~after conference~
d0riven
0
340
決定論的オーケストレーションの設計と実装 / Design and Implementation of Deterministic Orchestration
nrslib
3
1.3k
Claspは野良GASの夢をみるか
takter00
0
190
Featured
See All Featured
ピンチをチャンスに:未来をつくるプロダクトロードマップ #pmconf2020
aki_iinuma
128
56k
Let's Do A Bunch of Simple Stuff to Make Websites Faster
chriscoyier
508
140k
How To Stay Up To Date on Web Technology
chriscoyier
790
250k
Raft: Consensus for Rubyists
vanstee
141
7.5k
Building the Perfect Custom Keyboard
takai
2
790
Technical Leadership for Architectural Decision Making
baasie
3
410
The Cost Of JavaScript in 2023
addyosmani
55
10k
SERP Conf. Vienna - Web Accessibility: Optimizing for Inclusivity and SEO
sarafernandez
2
1.5k
Believing is Seeing
oripsolob
1
140
Organizational Design Perspectives: An Ontology of Organizational Design Elements
kimpetersen
PRO
1
720
Deep Space Network (abreviated)
tonyrice
0
170
Groundhog Day: Seeking Process in Gaming for Health
codingconduct
0
210
Transcript
SwiftͱProtocol-Oriented Programming 2018.4.10 Shota Nakagami / @shtnkgm
ຊͷΰʔϧ ϓϩτίϧࢦΛͬͯɺͬͱSwiftyͳΤϯδχΞʹ
"Swift is a protocol-oriented language. " — David Abrahams @WWDC2015
Google Trendsʮprotocol-oriented programmingʯ
ϓϩτίϧΦϦΤϯςουͬͯͳΜͩΖ͏ʁ !
Protocol-Oriented Programming: POP • ༁͢ͱϓϩτίϧࢦϓϩάϥϛϯά • ϓϩτίϧࢦϓϩάϥϛϯάϓϩάϥϛϯάύϥμΠϜͷ Ұͭ
ϓϩάϥϛϯάύϥμΠϜͬͯͳΜͩΖ͏ʁ !
Programming Paradigm • ϓϩάϥϛϯάΛ͢Δͱ͖ͷߟ͑ํɺํ๏ͷ͜ͱ • ҰͭͷݴޠͰෳͷύϥμΠϜʹྨ͞ΕΔ͜ͱ͋Δ ʢ= ϚϧνύϥμΠϜʣ
ϓϩάϥϛϯάύϥμΠϜͷҰྫ ϓϩάϥϛϯάύϥμΠϜ ֓ཁ खଓ͖ܕʢProceduralʣ ঢ়ଶΛ࣋ͪɺҰ࿈ͷॲཧΛؔʹ·ͱΊΔ ΦϒδΣΫτࢦʢObject-Orientedʣ σʔλৼΔ͍ΛΦϒδΣΫτʹ࣋ͨͤΔ ؔܕʢFunctionalʣ ঢ়ଶ෭࡞༻Λ࣋ͨͳ͍ؔΛΈ߹ΘͤΔ ϦΞΫςΟϒʢReactiveʣ
σʔλͷྲྀΕʢdata flowʣͱσʔλͷมԽͷ ʹண δΣωϦοΫʢGenericʣ σʔλܗࣜʹґଘ͠ͳ͍ ΞεϖΫτࢦʢAspect-Orientedʣ ԣஅతؔ৺ࣄͷʹண
iOSΞϓϦ։ൃϚϧνύϥμΠϜ • Objective-CɾɾɾΦϒδΣΫτࢦ • Swiftɾɾɾϓϩτίϧࢦ ʢΦϒδΣΫτࢦ&ؔܕ&δΣωϦοΫʣ • ಛʹɺUIKitΦϒδΣΫτࢦͱͷؔΘΓ͕ڧ͍
ΦϒδΣΫτࢦͬͯͳΜ͚ͩͬʁ
ΦϒδΣΫτࢦͷ͓͞Β͍
Object-Oriented Programming: OOP • σʔλϝιουΛ࣋ͬͨΦϒδΣΫτΛͭͬͯͦ͘ͷ૬ޓ࡞ ༻ͰγεςϜΛܗ࡞Δ • ΦϒδΣΫτࢦͷࡾݪଇ • ϙϦϞʔϑΟζϜʢଟଶੑʣ
• ΧϓηϧԽʢӅṭʣ • ܧঝ
UIKitͷΫϥε֊
None
ΦϒδΣΫτࢦͱϓϩτίϧࢦ
Swift Standard Framework΄΅ߏମͰߏ ओͳߏཁૉ ΦϒδΣΫτࢦ ϓϩτίϧࢦ ܕ ࢀরܕʢClassʣ ܕʢStruct/Enumʣ நԽ
Superclass Protocol →Obective-C࣌ͷΫϥεͷར༻͔Βߏମͷར༻͕த৺ʹ
ΦϒδΣΫτࢦͰʮಈʯΛσβΠϯͯ͠ΈΔ
͍ΖΜͳಈΫϥεΛͭ͘Γ·͢
class Fish { } class Cat { } class Dog
{ } class Bird { }
Ͳͷಈ͝ΜΛ৯Δ →ॲཧΛڞ௨Խ͍ͨ͠
class Fish { func eat() { /* something */ }
} class Cat { func eat() { /* something */ } } class Dog { func eat() { /* something */ } } class Bird { func eat() { /* something */ } }
Ϋϥεʹڞ௨ॲཧΛ࣮ͯ͠ܧঝ
class Animal { func eat() { /* something */ }
} class Fish: Animal { } class Cat: Animal { } class Dog: Animal { } class Bird: Animal { }
Ҡಈํ๏·ͱΊΒΕͦ͏ʁ
Ϋϥεʹ࣮ʁ
class Animal { func eat() { /* something */ }
func swim() { /* something */ } func run() { /* something */ } func fly() { /* something */ } } class Dog: Animal { } let dog = Dog() dog.fly()
class Animal { func eat() { /* something */ }
func swim() { /* something */ } func run() { /* something */ } func fly() { /* something */ } } class Dog: Animal { } let dog = Dog() dog.fly()
ۭඈͿ͍͵͕ൃੜʢόάʣ
Ҡಈํ๏ʹ͍ͭͯͷந֓೦Λ࣮
ΑΓ҆શͳϓϩάϥϜʹ class Animal { func eat() { /* something */
} } class RunAnimal: Animal { func run() { /* something */ } } class Dog: RunAnimal { } let dog = Dog() dog.run() // OK dog.fly() // ίϯύΠϧΤϥʔ
ʊਓਓਓਓਓਓਓਓਓʊ ʼɹಥવͷ༷มߋɹʻ ʉY^Y^Y^Y^Y^Y^Y^Yʉ
None
ӭ͛ͯΕΔΧΤϧʁ
None
ΫϥεଟॏܧঝΛαϙʔτ͍ͯ͠ͳ͍ // error: multiple inheritance from classes 'SwimAnimal' and 'RunAnimal'
class Frog: SwimAnimal, RunAnimal { }
Ϋϥεͷܧঝʹؔ͢Δᶃ • ୯Ұʢ୯७ʣܧঝ͔͠Ͱ͖ͳ͍ͷͰɺΫϥεઃܭ͕͍͠ ɹˠΫϥε͕ංେԽɺڽू͕͘ͳΓ͕ͪʢͪ͝Ό·ͥʣ
Ϋϥεͷܧঝʹؔ͢Δᶄ • Ϋϥεͷมߋ͕શͯͷܧঝઌΫϥεʹٴ͢Δ ɹ →όάͷݪҼɺΫϥεมߋ͠ʹ͍͘
Ϋϥεͷܧঝʹؔ͢Δᶅ • ந֓೦ΠϯελϯεԽͰ͖ͯ͠·͏ →όάͷݪҼ // ۩ΫϥεͷΠϯελϯεԽ let dog = Dog()
let frog = Frog() // நΫϥεͷΠϯελϯεԽ let animal = Animal() // ͲΜͳಈʁ
Ϋϥεͷܧঝʹؔ͢Δᶆ • ΦʔόʔϥΠυલఏͷϝιου class Animal { func bark() { //
ಈͱ͍͏֓೦ͳΜͯ໐͘?? // // } }
Ϋϥεͷܧঝʹؔ͢Δᶆ • ΦʔόʔϥΠυલఏͷϝιου class Animal { func bark() { //
ಈͱ͍͏֓೦ͳΜͯ໐͘?? // ΦʔόʔϥΠυ͞Εͳ͍߹Ϋϥογϡͤ͞Δ͔... fatalError() } } ܧঝઌͰͷ࣮࿙Ε͕͋Δͱόάͷݩʹ
ϓϩτίϧࢦͰʮಈʯΛσβΠϯͯ͠ΈΔ
Protocol Conformance ϓϩτίϧ४ڌʢద߹ʣ
ੑ࣭ΛϓϩτίϧͰදݱͯ͠४ڌ
protocol Eatable { func eat() } struct Cat: Eatable {
// eatϝιουͷ࣮͕ڧ੍͞ΕΔ // ίϯύΠϥͰνΣοΫ͞ΕΔͷͰ҆શ func eat() { print("ͺ͘ͺ͘") } }
Protocol Extension ϓϩτίϧΤΫεςϯγϣϯʢ֦ுʣ
ϓϩτίϧΤΫεςϯγϣϯͰσϑΥϧτ࣮ protocol Eatable { func eat() } extension Eatable {
func eat() { print("͙͙") } } struct Dog: Eatable { } let dog = Dog() dog.eat() // ͙͙
Protocol Composition ϓϩτίϧίϯϙδγϣϯʢ߹ʣ
ෳϓϩτίϧ४ڌͰΧΤϧղফ
struct Frog: Swimmable, Runnable { } let frog = Frog()
frog.swim() frog.run()
Protocol Inheritance ϓϩτίϧܧঝ
ϓϩτίϧܧঝՄೳ
protocol Movable { func move(method: String) } extension Movable {
func move(method: String) { print(method + "ਐΈ·͢") } } protocol Swimmable: Movable { func swim() } extension Swimmable { func swim() { move(method: "ӭ͍Ͱ") } } struct Fish: Swimmable { } let fish = Fish() fish.swim() // ӭ͍ͰਐΈ·͢
͞ΒʹFlyableΛಈͰͳ͍ܕͰ४ڌ • e.g. ඈߦػ • ඈͿͱ͍͏ੑ࣭͔Βઃܭ͢Δ͜ͱͰɺಈʹґଘ͠ͳ͍ • ॊೈͰ֦ுੑͷ͋ΔϓϩάϥϜʹͳΔ
ϓϩτίϧܕͰ͑Δ • ܕͷStructEnumʹΫϥεͷΑ͏ͳܧঝػೳͳ͍͕ɺϓ ϩτίϧʹ४ڌͰ͖Δ • ܕࢀরܕʢΫϥεʣΑΓ҆શ • Λڞ༗͠ͳ͍ͷͰҙਤ͠ͳ͍ͷมߋ͕ൃੜ͠ͳ͍ • εϨουηʔϑ
• ॥ࢀর͕ൃੜ͠ͳ͍
ϓϩτίϧܕͱͯ͠ѻ͑Δ • ϙϦϞʔϑΟζϜͰૄ݁߹ʹ ! func feed(eatable: Eatable) • ΠϯελϯεԽෆՄ !
// Error: Protocol type 'Eatable' cannot be instantiated let eatable = Eatable()
δΣωϦΫεʢ૯শܕʣ͑Δ ΫϥεStructͷΑ͏ͳܕύϥϝʔλ<T>͑ͳ͍͕ɺ associatedtypeͰ૯শܕΛఆٛͰ͖Δ class Eatable<FoodType> { } struct Eatable<FoodType> {
} protocol Eatable { associatedtype FoodType }
protocol Eatable { associatedtype FoodType func eat(food: FoodType) } struct
Bird: Eatable { typealias FoodType = Fish func eat(food: FoodType) { // do something } }
ϓϩτίϧࢦ͍͍Ͷ
·ͱΊ
࠷ڧͷϓϩάϥϛϯάύϥμΠϜͳ͍ • ͲΕղܾͷखஈͷҰͭʹ͗͢ͳ͍ • ϓϩτίϧࢦΛΔ͜ͱͰϓϩάϥϛϯάͷ෯͕͕Δ • ͍ΖΜͳํ๏ΛΓɺదࡐదॴ͑Δͷ͕࠷ڧ
ΦϒδΣΫτࢦ ϓϩτίϧࢦ σʔλͷ҉తڞ༗ ×ʢ͋Γʣ ◦ʢͳ͠ʣ நԽ ◦ʢSuperclassʣ ◦ʢProtocolʣ ίϯϙδγϣϯ ×ʢͰ͖ͳ͍ʣ
◦ʢProtocol Compositionʣ நܕͷΠϯελϯεԽ ×ʢͰ͖Δʣ ◦ʢͰ͖ͳ͍ʣ σϑΥϧτ࣮ ◦ʢSuperclassʣ ◦ʢProtocol Extensionʣ ۩ܕͷ࣮ͷڧ੍ ×ʢಈతνΣοΫʣ ◦ʢ੩తνΣοΫʣ ϙϦϞʔϑΟζϜ ◦ʢSuperclassʣ ◦ʢProtocolʣ δΣωϦΫε ◦ʢܕύϥϝʔλʣ ◦ʢassociatedtypeʣ UIKitΦϒδΣΫτͷܧঝ ◦ʢͰ͖Δʣ ×ʢͰ͖ͳ͍ʣ ϥΠϑαΠΫϧཧʢdeinitʣ ◦ʢ͋Γʣ ×ʢͳ͠ʣ Ұҙੑͷ͋Δσʔλʢsingletonʣ ◦ʢ࡞Γ͍͢ʣ ×ʢ࡞Γʹ͍͘ʣ
ΑΓৄ͘͠ • WWDC2015ηογϣϯಈը Protocol-Oriented Programming in Swift / WWDC2015 •
ެࣜϦϑΝϨϯε Protocols / The Swift Programming Language (Swift 4.1) • ॻ੶ Swift 4 Protocol-Oriented Programming - Third Edition
͓ΘΓ