Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Speaker Deck
PRO
Sign in
Sign up for free
Protocol と Class と SubClass
Elvis Shi
August 08, 2017
Programming
0
1.5k
Protocol と Class と SubClass
Protocol で宣言したメソッドが Class / SubClass での動き
Elvis Shi
August 08, 2017
Tweet
Share
More Decks by Elvis Shi
See All by Elvis Shi
偏見と妄想で語るスクリプト言語としての Swift / Swift as a Scripting Language
lovee
2
300
danger-swift-kantoku
lovee
1
140
Decimal、正しく使ってる? / Are you using Decimal correctly?
lovee
4
280
A story about me trying to make a router that manages when, how and which view to transit in a SwiftUI app
lovee
1
160
M1チップの脆弱性M1raclesを読み解く / About the vulnerability on M1 chip called M1racles
lovee
1
790
Demystify SwiftUI 要約 / Summary of Demystify SwiftUI
lovee
3
350
いいから `!` を使え! / Shut up and use `!` !
lovee
11
3.4k
SwiftUIにおける依存性逆転原則の戦略 / A strategy to import Dependency-Inversion-Principle in SwiftUI apps
lovee
3
430
CGAffineTransform はどう動いてるのか?〜Swift エンジニアのための線形代数〜 / How does CGAffineTransform work? ~A linearity lesson for Swift engineers~
lovee
0
220
Other Decks in Programming
See All in Programming
Composing an API with Kotlin (Kotlin Dev Day 2022)
zsmb
0
310
Licences open source : entre guerre de clochers et radicalité
pylapp
2
380
熊でもわかるCI/CD/モダンインフラVol1:用語を覚えよう編
srockstyle
0
110
Viteはいいぞ/Vite is Good
dojineko
1
110
NieR Re[in]carnationにおけるUnityアニメーション活用術
applibot
1
960
機能横断型チームにおける技術改善
takeshiakutsu
3
510
あなたの会社の古いシステム、なんとかしませんか?~システム刷新から考えるDX化への道筋とバリエーション~/webinar20220420-systems
grapecity_dev
0
130
マイクロサービスプラットフォーム向け負荷試験基盤の初期リリースを終えた話
yuyu_hf
PRO
1
500
バンドル最適化マニアクス at tfconf
mizchi
5
2.4k
既存画面の Jetpack Composeでの書き換え: FAANSでの事例紹介 / Case study of rewriting existing screens with Jetpack Compose
horie1024
0
360
デュアルトラックアジャイル× Agile Testingから 見えてきたQAのミライ
atamaplus
0
500
SRE bridge the gap: Feature development to Core API / 機能開発チームとコアAPIチームの架け橋としてのSRE
kenzan100
1
600
Featured
See All Featured
Dealing with People You Can't Stand - Big Design 2015
cassininazir
350
21k
The Most Common Mistakes in Cover Letters
jrick
PRO
4
24k
Bash Introduction
62gerente
596
210k
The MySQL Ecosystem @ GitHub 2015
samlambert
238
11k
Keith and Marios Guide to Fast Websites
keithpitt
404
21k
Art, The Web, and Tiny UX
lynnandtonic
280
17k
Java REST API Framework Comparison - PWX 2021
mraible
PRO
11
4.6k
Put a Button on it: Removing Barriers to Going Fast.
kastner
56
2.3k
Faster Mobile Websites
deanohume
294
28k
Building Better People: How to give real-time feedback that sticks.
wjessup
343
17k
Building Your Own Lightsaber
phodgson
94
4.6k
Embracing the Ebb and Flow
colly
73
3.3k
Transcript
Protocol ͱ Class ͱ SubClass for Otemachi.swift x Kyobashi.swift #01
override init() { super.init() emplyedBy = "MAGES. 5pb. Game div"
job = "iOS Developer…?" twitter = "@lovee" qiita = "@lovee" github = "el-hoshino" additionalInfo = "Unity ਏ͍ʘ(^o^)ʗ" class Speaker: Developer { } }
খωλ protocol SomeProtocol { func printSelf() } extension SomeProtocol {
func printSelf() { print("SomeProtocol") } } protocol SomeProtocol { } extension SomeProtocol { func printSelf() { print("SomeProtocol") } } ≠
খωλ protocol SomeProtocol { func printSelf() } extension SomeProtocol {
func printSelf() { print("SomeProtocol") } } class SomeClass: SomeProtocol { func printSelf() { print("SomeClass") } } let sc = SomeClass() sc.printSelf() // SomeClass (sc as SomeProtocol).printSelf() // SomeClass protocol SomeProtocol { } extension SomeProtocol { func printSelf() { print("SomeProtocol") } } class SomeClass: SomeProtocol { func printSelf() { print("SomeClass") } } let sc = SomeClass() sc.printSelf() // SomeClass (sc as SomeProtocol).printSelf() // SomeProtocol ≠
খωλ protocol SomeProtocol { func printSelf() } extension SomeProtocol {
func printSelf() { print("SomeProtocol") } } class SomeClass: SomeProtocol { func printSelf() { print("SomeClass") } } let sc = SomeClass() sc.printSelf() // SomeClass (sc as SomeProtocol).printSelf() // SomeClass protocol SomeProtocol { } extension SomeProtocol { func printSelf() { print("SomeProtocol") } } class SomeClass: SomeProtocol { func printSelf() { print("SomeClass") } } let sc = SomeClass() sc.printSelf() // SomeClass (sc as SomeProtocol).printSelf() // SomeProtocol ≠ Protocol ͷ Interface (PI) એݴ PI σϑΥϧτ࣮ PI ຊ࣮ PI ݺͼग़͠ PI ݺͼग़͠ Protocol ͷ Interface (PI) એݴͳ͠ Protocol ͷ Method (PM) ࣮ Class ͷ Method (CM) ࣮ CM ݺͼग़͠ PM ݺͼग़͠
খωλ ⬆ৄ͘͠⬆ http://qiita.com/HaNoHito/items/f40bfc1717c1e922a5b0 https://speakerdeck.com/nhamada/swiftniokerumethod-dispatchnituite
খωλ protocol SomeProtocol { func printSelf() } extension SomeProtocol {
func printSelf() { print("SomeProtocol") } } class SomeClass: SomeProtocol { func printSelf() { print("SomeClass") } } let sc = SomeClass() sc.printSelf() // SomeClass (sc as SomeProtocol).printSelf() // SomeClass protocol SomeProtocol { } extension SomeProtocol { func printSelf() { print("SomeProtocol") } } class SomeClass: SomeProtocol { func printSelf() { print("SomeClass") } } let sc = SomeClass() sc.printSelf() // SomeClass (sc as SomeProtocol).printSelf() // SomeProtocol ≠ Protocol ͷ Interface (PI) એݴ PI σϑΥϧτ࣮ PI ຊ࣮ PI ݺͼग़͠ PI ݺͼग़͠ Protocol ͷ Interface (PI) એݴͳ͠ Protocol ͷ Method (PM) ࣮ Class ͷ Method (CM) ࣮ CM ݺͼग़͠ PM ݺͼग़͠
ຊ protocol SomeProtocol { func printSelf() } extension SomeProtocol {
func printSelf() { print("SomeProtocol") } } class SomeClass: SomeProtocol { func printSelf() { print("SomeClass") } } let sc = SomeClass() sc.printSelf() // SomeClass (sc as SomeProtocol).printSelf() // SomeClass
ຊ protocol SomeProtocol { func printSelf() } extension SomeProtocol {
func printSelf() { print("SomeProtocol") } } class SomeClass: SomeProtocol { }
ຊ protocol SomeProtocol { func printSelf() } extension SomeProtocol {
func printSelf() { print("SomeProtocol") } } class SomeClass: SomeProtocol { } class SomeSubClass: SomeClass { func printSelf() { print("SomeSubClass") } } class Parent { let someClass: SomeClass // init(someClass: SomeClass) { ... } func printSelf() { someClass.printSelf() } } let ssc = SomeSubClass() let p = Parent(someClass: ssc) ssc.printSelf() // SomeSubClass p.printSelf() // ?
ຊ protocol SomeProtocol { func printSelf() } extension SomeProtocol {
func printSelf() { print("SomeProtocol") } } class SomeClass: SomeProtocol { } class SomeSubClass: SomeClass { func printSelf() { print("SomeSubClass") } } class Parent { let someClass: SomeClass // init(someClass: SomeClass) { ... } func printSelf() { someClass.printSelf() } } let ssc = SomeSubClass() let p = Parent(someClass: ssc) ssc.printSelf() // SomeSubClass p.printSelf() // ? "ग़ྗʁ AɿSomeProtocol BɿSomeClass CɿSomeSubClass
ຊ protocol SomeProtocol { func printSelf() } extension SomeProtocol {
func printSelf() { print("SomeProtocol") } } class SomeClass: SomeProtocol { } class SomeSubClass: SomeClass { func printSelf() { print("SomeSubClass") } } class Parent { let someClass: SomeClass // init(someClass: SomeClass) { ... } func printSelf() { someClass.printSelf() } } let ssc = SomeSubClass() let p = Parent(someClass: ssc) ssc.printSelf() // SomeSubClass p.printSelf() // SomeProtocol "ग़ྗʁ AɿSomeProtocol# BɿSomeClass$ CɿSomeSubClass$
ຊ protocol SomeProtocol { func printSelf() } extension SomeProtocol {
func printSelf() { print("SomeProtocol") } } class SomeClass: SomeProtocol { } class SomeSubClass: SomeClass { func printSelf() { print("SomeSubClass") } } class Parent { let someClass: SomeClass // init(someClass: SomeClass) { ... } func printSelf() { someClass.printSelf() } } let ssc = SomeSubClass() let p = Parent(someClass: ssc) p.printSelf() // SomeProtocol // == (ssc as SomeClass).printSelf() // == (ssc as SomeProtocol).printSelf() Protocol ͷ Interface (PI) એݴ PI ຊ࣮ͳ͠ʢσϑΥϧτ࣮༻ʣ PI ຊ࣮ʢσϑΥϧτ࣮ʣݺͼग़͠ PI ຊ࣮ʢσϑΥϧτ࣮ʣݺͼग़͠ Class (SomeSubClass) ͷ Method ࣮
p.printSelf()Ͱ SomeSubClass Λ ग़ྗͤ͞Δʹʁ
ຊ protocol SomeProtocol { func printSelf() } extension SomeProtocol {
func printSelf() { print("SomeProtocol") } } class SomeClass: SomeProtocol { } class SomeSubClass: SomeClass { func printSelf() { print("SomeSubClass") } } class Parent { let someClass: SomeClass // init(someClass: SomeClass) { ... } func printSelf() { someClass.printSelf() } } let ssc = SomeSubClass() let p = Parent(someClass: ssc) p.printSelf() // SomeProtocol // == (ssc as SomeClass).printSelf() // == (ssc as SomeProtocol).printSelf()
ຊ protocol SomeProtocol { func printSelf() } extension SomeProtocol {
func printSelf() { print("SomeProtocol") } } class SomeClass: SomeProtocol { } class SomeSubClass: SomeClass { func printSelf() { print("SomeSubClass") } } class Parent { let someClass: SomeClass // init(someClass: SomeClass) { ... } func printSelf() { someClass.printSelf() } } let ssc = SomeSubClass() let p = Parent(someClass: ssc) p.printSelf() // SomeProtocol // == (ssc as SomeClass).printSelf() // == (ssc as SomeProtocol).printSelf() protocol SomeProtocol { func printSelf() } extension SomeProtocol { func printSelf() { print("SomeProtocol") } } class SomeClass: SomeProtocol { } class SomeSubClass: SomeClass { func printSelf() { print("SomeSubClass") } } class Parent { let someClass: SomeClass // init(someClass: SomeClass) { ... } func printSelf() { someClass.printSelf() } } let ssc = SomeSubClass() let p = Parent(someClass: ssc) p.printSelf() // SomeProtocol // == (ssc as SomeClass).printSelf() // == (ssc as SomeProtocol).printSelf()
ຊ protocol SomeProtocol { func printSelf() } extension SomeProtocol {
func printSelf() { print("SomeProtocol") } } class SomeClass: SomeProtocol { } class SomeSubClass: SomeClass { func printSelf() { print("SomeSubClass") } } class Parent { let someClass: SomeClass // init(someClass: SomeClass) { ... } func printSelf() { someClass.printSelf() } } let ssc = SomeSubClass() let p = Parent(someClass: ssc) p.printSelf() // SomeProtocol // == (ssc as SomeClass).printSelf() // == (ssc as SomeProtocol).printSelf() protocol SomeProtocol { func printSelf() } extension SomeProtocol { func printSelf() { print("SomeProtocol") } } class SomeClass: SomeProtocol { func printSelf() { (self as SomeProtocol).printSelf() } } class SomeSubClass: SomeClass { override func printSelf() { print("SomeSubClass") } } class Parent { let someClass: SomeClass // init(someClass: SomeClass) { ... } func printSelf() { someClass.printSelf() } } let ssc = SomeSubClass() let p = Parent(someClass: ssc) p.printSelf() // SomeSubClass // == (ssc as SomeClass).printSelf() // == (ssc as SomeProtocol).printSelf()
ຊ protocol SomeProtocol { func printSelf() } extension SomeProtocol {
func printSelf() { print("SomeProtocol") } } class SomeClass: SomeProtocol { } class SomeSubClass: SomeClass { func printSelf() { print("SomeSubClass") } } class Parent { let someClass: SomeClass // init(someClass: SomeClass) { ... } func printSelf() { someClass.printSelf() } } let ssc = SomeSubClass() let p = Parent(someClass: ssc) p.printSelf() // SomeProtocol // == (ssc as SomeClass).printSelf() // == (ssc as SomeProtocol).printSelf() protocol SomeProtocol { func printSelf() } extension SomeProtocol { func printSelf() { print("SomeProtocol") } } class SomeClass: SomeProtocol { func printSelf() { (self as SomeProtocol).printSelf() } } class SomeSubClass: SomeClass { override func printSelf() { print("SomeSubClass") } } class Parent { let someClass: SomeClass // init(someClass: SomeClass) { ... } func printSelf() { someClass.printSelf() } } let ssc = SomeSubClass() let p = Parent(someClass: ssc) p.printSelf() // SomeSubClass // == (ssc as SomeClass).printSelf() // == (ssc as SomeProtocol).printSelf() Protocol ͷ Interface (PI) એݴ PI ຊ࣮ͳ͠ʢσϑΥϧτ࣮༻ʣ Class (SomeSubClass) ͷ Method ࣮ PI ຊ࣮ʢσϑΥϧτ࣮ʣݺͼग़͠ PI ຊ࣮ʢσϑΥϧτ࣮ʣݺͼग़͠ Protocol ͷ Interface (PI) એݴ PI ຊ࣮ʢσϑΥϧτ࣮ྲྀ༻ʣ PI ຊ࣮ʢαϒΫϥεʹΑΔΦʔόʔϥΠυʣ PI ຊ࣮ʢσϑΥϧτ࣮ʣݺͼग़͠ PI ຊ࣮ʢΦʔόʔϥΠυࡁΈʣݺͼग़͠
final ͡Όͳ͍ class ɺ σϑΥϧτ࣮Λ͏߹Ͱɺ PI ͷ࣮Λলུͯ͠ͳΒͳ͍ɻ Զ ݁
⺄⇾獌K15&%ٛڋق⚸ק猳