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
330
Property Wrappers
shtnkgm
0
370
Saliency Detection
shtnkgm
0
89
パフォーマンス改善とユニットテスト
shtnkgm
4
1.7k
iOSのコードベースレイアウト
shtnkgm
2
840
20190117_iOSLT_CBLinSwift.pdf
shtnkgm
0
130
SwiftとFunctional Reactive Programming
shtnkgm
0
200
20180710_iOSLT_iOSでDarkModeを実装する
shtnkgm
0
130
20180220_iOSLT_Swiftとオブジェクト間の通知のパターン
shtnkgm
0
170
Other Decks in Programming
See All in Programming
「寝てても仕事が進む」Claude Codeで組む第二の脳
tomoyafujita2016
0
350
「人を評価する AI」の設計と実装
ryoyanara
0
230
仕様駆動開発へのトライを機に チームに適合する手法を模索し続けている話
freee
PRO
0
590
承認済みなのに差戻しできてしまうバグ、型で潰せます
shinchit
0
100
いまどきの Codex で開発する visionOS アプリの開発スタイルについて
karad
0
160
[PyCon KR 2026] More Variants, More Diversity for AI Accelerators
achimnol
0
110
片田舎のおっさん、 Swift Buildのダイアモンド問題解決の不具合修正PRを出すが、解決方法がキャッシュをしないようにすることであり、ビルド時間が伸びると言われてマージされないので高速化もする/swiftbuild
yimajo
0
270
freee が目指す データ マネジメント戦略 AI-Ready 時代を支える 攻めのガバナンスとは
freee
PRO
0
460
初めての模倣学習とVLA
natsutan
0
190
引き算の組織 ― アウトカムとAIに全振りするために辞めたこと ― / Organization by Subtraction
hirokiyamamoto14
PRO
0
280
関東Kaggler会_NVIDIA_Nemotron_コンペ_振り返り
rick_ds
0
710
Pythonの実行はどこまで賢くなったのか? CPythonとPyPyから見る最適化のしくみ
curekoshimizu
3
1.7k
Featured
See All Featured
A Modern Web Designer's Workflow
chriscoyier
698
190k
Fantastic passwords and where to find them - at NoRuKo
philnash
52
3.8k
Taking LLMs out of the black box: A practical guide to human-in-the-loop distillation
inesmontani
PRO
3
2.4k
Making Projects Easy
brettharned
120
6.7k
New Earth Scene 8
popppiees
3
2.5k
How Software Deployment tools have changed in the past 20 years
geshan
1
34k
WENDY [Excerpt]
tessaabrams
11
39k
From Legacy to Launchpad: Building Startup-Ready Communities
dugsong
0
300
Max Prin - Stacking Signals: How International SEO Comes Together (And Falls Apart)
techseoconnect
PRO
0
420
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
162
16k
The untapped power of vector embeddings
frankvandijk
2
1.8k
The Art of Delivering Value - GDevCon NA Keynote
reverentgeek
16
2.1k
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
͓ΘΓ