---
title: ジェネリック関数の呼び出され方 #cocoa_kansai
tags:  #cocoa関西 #swift #ジェネリックプログラミング  
author: [熊谷友宏](https://www.docswell.com/user/es_kumagai)
site: [Docswell](https://www.docswell.com/)
thumbnail: https://bcdn.docswell.com/page/KJ49X43571.jpg?width=480
description: Swift 2.0 で登場した目玉機能の『Protocol Extension』はジェネリックという型にとらわれない仕組みを活かしたものになっています。ジェネリックでは様々な型をプロトコルなどの様々な条件を組み合わせて機能実装を行っていくんですが、条件によっては、どれが該当するのか、どれが優先されるのか、そもそもビルドエラーになるのか。基本的にはシンプルなルールを組み合わせて作れば良さそうですが、実際にやってみると結構混乱します。  その辺りをサクッと体系立てて紹介できれば…と思ったんですが、調べてみれば微妙な違いがたくさんあって、そこまでたどり着けませんでした。続きはぜひぜひ、みなさんの目で確かめてみてください。  ※ Docswell での公開に移行する直前の Slideshare での閲覧数は 1,269 でした。
published: September 12, 15
canonical: https://www.docswell.com/s/es_kumagai/5YDEGD-cocoakansai63-150912075719-lva1-app6891
---
# Page. 1

![Page Image](https://bcdn.docswell.com/page/KJ49X43571.jpg)

ジェネリック関数の
呼び出され方を調べてみる
『難しい』ことだけは分かった！ !
EZ-NET 熊谷友宏
http://ez-net.jp/
2015.09.12 @ 第 63 回 Cocoa 勉強会関西


# Page. 2

![Page Image](https://bcdn.docswell.com/page/LE1KN412JG.jpg)

競合書、作ってます。
VS
Xcode 5 徹底解説
2014/04/28 -
Xcode 5 完全攻略
2014/02/27 -


# Page. 3

![Page Image](https://bcdn.docswell.com/page/GEWD4X82J2.jpg)

競合書、作ってました。
！
版
絶
Xcode 5 徹底解説
2014/04/28 - 2015/08/21
KO
Xcode 5 完全攻略
2014/02/27 -


# Page. 4

![Page Image](https://bcdn.docswell.com/page/47ZG2684E3.jpg)

熊谷友宏
EZ-NET http://ez-net.jp/
@es̲kumagai
̶ 勉強会開催 ̶
#yidev 横浜 iPhone 開発者勉強会
カジュアル Swift 勉強会 @ 青葉台
Xcode 5 徹底解説
MOSA
IP Phone
音でダイヤル
いつもの電卓
with 割勘ウォッチ
音で再配達ゴッド


# Page. 5

![Page Image](https://bcdn.docswell.com/page/YJ6YV2PG7V.jpg)

Swift 2.0 GM


# Page. 6

![Page Image](https://bcdn.docswell.com/page/GJ5GD2KXJ4.jpg)

Swift 2.0
新機能
▶ Protocol Extension ▶ if-where
▶ Error Handling
▶ for-where
▶ guard
▶ enum : String
▶ defer
▶ Type.init
▶ repeat-while
▶ #available
▶ pattern matching


# Page. 7

![Page Image](https://bcdn.docswell.com/page/9E2Y84WQER.jpg)

Swift 2.0
新機能
http://www.slideshare.net/
tomohirokumagai54/swift-20-cswift


# Page. 8

![Page Image](https://bcdn.docswell.com/page/D7YG6MLY7M.jpg)

Protocol Extension
ジェネリックの活用の幅が広がった


# Page. 9

![Page Image](https://bcdn.docswell.com/page/VENGZW4RJ8.jpg)

Swift 2.0
Protocol Extension
http://www.slideshare.net/
tomohirokumagai54/wwdc21cafe


# Page. 10

![Page Image](https://bcdn.docswell.com/page/Y79WZXQZ73.jpg)

Protocol Extension
プロトコルに既定の実装を追加
extension CollectionType
where Generator.Element : IntegerType {
var sum:Generator.Element {
return self.reduce(0, combine: +)
}
}


# Page. 11

![Page Image](https://bcdn.docswell.com/page/G78N12QYJD.jpg)

ジェネリックで条件を指定
extension CollectionType
where Generator.Element : IntegerType {


# Page. 12

![Page Image](https://bcdn.docswell.com/page/L7LPQ2X9JR.jpg)

Array&lt;Int&gt;
どちらの実装が採用される？
extension CollectionType
where Generator.Element : IntegerType {
func action() -&gt; String { return &quot;A&quot; }
}
extension CollectionType
where Generator.Element : BooleanType {
func action() -&gt; String { return &quot;B&quot; }
}


# Page. 13

![Page Image](https://bcdn.docswell.com/page/4EM418LVJW.jpg)

Array&lt;Int&gt;
どちらの実装が採用される？
extension CollectionType
where Generator.Element : Equatable {
func action() -&gt; String { return &quot;A&quot; }
}
extension CollectionType
where Generator.Element : Comparable {
func action() -&gt; String { return &quot;B&quot; }
}


# Page. 14

![Page Image](https://bcdn.docswell.com/page/PERWL5KWJ9.jpg)

Array&lt;Int&gt;
どちらの実装が採用される？
extension CollectionType
where Generator.Element : Equatable {
func action() -&gt; String { return &quot;A&quot; }
}
extension CollectionType
where Generator.Element : Hashable {
func action() -&gt; String { return &quot;B&quot; }
}


# Page. 15

![Page Image](https://bcdn.docswell.com/page/P7XPWKLVJX.jpg)

Array&lt;Int&gt;
どちらの実装が採用される？
extension CollectionType
where Generator.Element : Comparable {
s
func action() -&gt; String
{ return &quot;A&quot; }
u
o
}
u
g
i
b
m
A
extension CollectionType
where Generator.Element : ForwardIndexType {
func action() -&gt; String { return &quot;B&quot; }
}


# Page. 16

![Page Image](https://bcdn.docswell.com/page/37KDV5L5ED.jpg)

ジェネリックの呼び出され方


# Page. 17

![Page Image](https://bcdn.docswell.com/page/LJ3RMK31E5.jpg)

構造体と型指定


# Page. 18

![Page Image](https://bcdn.docswell.com/page/8JDY634KJG.jpg)

シンプルな構造体
struct S1 {
}
S1


# Page. 19

![Page Image](https://bcdn.docswell.com/page/VEP6Y4M378.jpg)

型の直指定


# Page. 20

![Page Image](https://bcdn.docswell.com/page/27V3GX9NJQ.jpg)

シンプルな構造体
どの実装が採用される？
func f(v:S1) {
}
func f(v:S2) {
}
// 該当なし？
S1


# Page. 21

![Page Image](https://bcdn.docswell.com/page/5JG38VZ5EL.jpg)

シンプルな構造体
どの実装が採用される？
func f(v:S1) {
}
func f(v:Any) {
}
// 該当なし？
S1


# Page. 22

![Page Image](https://bcdn.docswell.com/page/47Q596LLEP.jpg)

シンプルな構造体
どの実装が採用される？
func f(v:S2) {
}
func f(v:Any) {
}
// 該当なし？
S1


# Page. 23

![Page Image](https://bcdn.docswell.com/page/KE49X4D5J1.jpg)

オプショナル


# Page. 24

![Page Image](https://bcdn.docswell.com/page/L71KN4Z2EG.jpg)

構造体とオプショナル
どの実装が採用される？
func f(v:S1) {
}
func f(v:S1?) {
}
// 該当なし？
S1?


# Page. 25

![Page Image](https://bcdn.docswell.com/page/G7WD4X92E2.jpg)

構造体とオプショナル
どの実装が採用される？
func f(v:S1) {
}
func f(v:Any?) {
}
// 該当なし？
S1?


# Page. 26

![Page Image](https://bcdn.docswell.com/page/4JZG269473.jpg)

構造体とオプショナル
どの実装が採用される？
func f(v:S1) {
}
func f(v:Any) {
}
// 該当なし？
S1?


# Page. 27

![Page Image](https://bcdn.docswell.com/page/YE6YV2KGJV.jpg)

構造体とオプショナル
どの実装が採用される？
func f(v:Any) {
}
る
func f(v:Any?) {
}
※
// 該当なし？
状
に
況
よ
S1?


# Page. 28

![Page Image](https://bcdn.docswell.com/page/GE5GD2PXE4.jpg)

構造体とオプショナル
S1?
どの実装が採用される？
func f(v:Any) {
}
• f(Optional(s1))
func f(v:Any?) {
}
• let opt = Optional(s1)
• f(opt)
•
or
• f(Optional&lt;S1&gt;(s1))


# Page. 29

![Page Image](https://bcdn.docswell.com/page/972Y846Q7R.jpg)

クラス


# Page. 30

![Page Image](https://bcdn.docswell.com/page/DJYG6M9YJM.jpg)

シンプルなクラス
class A1 {
}
A1


# Page. 31

![Page Image](https://bcdn.docswell.com/page/V7NGZWLRE8.jpg)

シンプルなクラス
どの実装が採用される？
func f(v:A1) {
}
func f(v:A2) {
}
// 該当なし？
A1


# Page. 32

![Page Image](https://bcdn.docswell.com/page/YJ9WZX4ZJ3.jpg)

シンプルなクラス
どの実装が採用される？
func f(v:A1) {
}
func f(v:Any) {
}
// 該当なし？
A1


# Page. 33

![Page Image](https://bcdn.docswell.com/page/GJ8N12VYED.jpg)

シンプルなクラス
どの実装が採用される？
func f(v:A2) {
}
func f(v:Any) {
}
// 該当なし？
A1


# Page. 34

![Page Image](https://bcdn.docswell.com/page/LJLPQ259ER.jpg)

クラスとオプショナル
どの実装が採用される？
func f(v:A1) {
}
func f(v:A1?) {
}
// 該当なし？
A1?


# Page. 35

![Page Image](https://bcdn.docswell.com/page/47M4183VEW.jpg)

クラス継承


# Page. 36

![Page Image](https://bcdn.docswell.com/page/P7RWL5QWE9.jpg)

クラス継承
class A1 {
}
class B1 : A1 {
}
B1
A1


# Page. 37

![Page Image](https://bcdn.docswell.com/page/PJXPWK5VEX.jpg)

クラス継承
B1
どの実装が採用される？
func f(v:B1) {
}
func f(v:B2) {
}
// 該当なし？
A1


# Page. 38

![Page Image](https://bcdn.docswell.com/page/3JKDV5657D.jpg)

クラス継承
B1
どの実装が採用される？
func f(v:A1) {
}
func f(v:A2) {
}
// 該当なし？
A1


# Page. 39

![Page Image](https://bcdn.docswell.com/page/LE3RMK6175.jpg)

クラス継承
B1
どの実装が採用される？
func f(v:A1) {
}
func f(v:B1) {
}
// 該当なし？
A1


# Page. 40

![Page Image](https://bcdn.docswell.com/page/8EDY63VKEG.jpg)

クラスを親で扱うとき


# Page. 41

![Page Image](https://bcdn.docswell.com/page/V7P6Y4V3J8.jpg)

クラスを親で扱うとき
let v:A1 = B1()
B1
A1


# Page. 42

![Page Image](https://bcdn.docswell.com/page/2JV3GXZNEQ.jpg)

クラスを親で扱うとき
B1
どの実装が採用される？
func f(v:A1) {
}
func f(v:A2) {
}
// 該当なし？
A1


# Page. 43

![Page Image](https://bcdn.docswell.com/page/5EG38V457L.jpg)

クラスを親で扱うとき
B1
どの実装が採用される？
func f(v:B1) {
}
func f(v:B2) {
}
// 該当なし？
A1


# Page. 44

![Page Image](https://bcdn.docswell.com/page/4JQ596GL7P.jpg)

クラスを親で扱うとき
B1
どの実装が採用される？
func f(v:A1) {
}
func f(v:B1) {
}
// 該当なし？
A1


# Page. 45

![Page Image](https://bcdn.docswell.com/page/K749X455E1.jpg)

型指定とジェネリック指定


# Page. 46

![Page Image](https://bcdn.docswell.com/page/LJ1KN4W27G.jpg)

基本的なジェネリック


# Page. 47

![Page Image](https://bcdn.docswell.com/page/GJWD4X6272.jpg)

おさらい
型直指定で Any
func f(v:Any) {
}
S1


# Page. 48

![Page Image](https://bcdn.docswell.com/page/4EZG26Y4J3.jpg)

型指定とジェネリック
型直指定で Any
func f(v:Any) {
}
func f&lt;T&gt;(v:T) {
}
func f&lt;T:Any&gt;(v:T) {
}
S1


# Page. 49

![Page Image](https://bcdn.docswell.com/page/Y76YV2DGEV.jpg)

型指定とジェネリック
どの実装が採用される？
func f(v:Any) {
}
func f&lt;T&gt;(v:T) {
}
// 該当なし？
S1


# Page. 50

![Page Image](https://bcdn.docswell.com/page/G75GD23X74.jpg)

型指定とジェネリック
どの実装が採用される？
func f&lt;T==S1&gt;(v:T) {NG
も
}
そ
も
そ
// 該当なし？
S1


# Page. 51

![Page Image](https://bcdn.docswell.com/page/9J2Y84ZQJR.jpg)

プロトコル


# Page. 52

![Page Image](https://bcdn.docswell.com/page/DEYG6MRYEM.jpg)

構造体とプロトコル
protocol P1 {
}
struct S1 : P1 {
}
S1
P1


# Page. 53

![Page Image](https://bcdn.docswell.com/page/VJNGZWDR78.jpg)

プロトコルを型で扱う


# Page. 54

![Page Image](https://bcdn.docswell.com/page/YE9WZXGZE3.jpg)

プロトコルを型で指定
S1
どの実装が採用される？
func f(v:P1) {
}
// 該当なし？
P1


# Page. 55

![Page Image](https://bcdn.docswell.com/page/GE8N128Y7D.jpg)

プロトコルを型で指定
S1
どの実装が採用される？
func f(v:P1) {
}
func f(v:S1) {
}
// 該当なし？
P1


# Page. 56

![Page Image](https://bcdn.docswell.com/page/LELPQ2R97R.jpg)

プロトコルを型で指定
S1
どの実装が採用される？
func f(v:P1) {
}
func f(v:Any) {
}
// 該当なし？
P1


# Page. 57

![Page Image](https://bcdn.docswell.com/page/4JM418RV7W.jpg)

プロトコルを型で指定
S1
どの実装が採用される？
func f(v:P2) {
}
func f(v:Any) {
}
// 該当なし？
P1


# Page. 58

![Page Image](https://bcdn.docswell.com/page/PJRWL5RW79.jpg)

プロトコルをジェネリックで扱う


# Page. 59

![Page Image](https://bcdn.docswell.com/page/PEXPWKRV7X.jpg)

プロトコルを型で指定
S1
どの実装が採用される？
func f&lt;T:P1&gt;(v:T) {
}
// 該当なし？
P1


# Page. 60

![Page Image](https://bcdn.docswell.com/page/3EKDV5R5JD.jpg)

プロトコルを型で指定
S1
どの実装が採用される？
func f&lt;T:P1&gt;(v:T) {
}
func f&lt;T&gt;(v:T) {
}
// 該当なし？
P1


# Page. 61

![Page Image](https://bcdn.docswell.com/page/L73RMK81J5.jpg)

プロトコルを型で指定
S1
どの実装が採用される？
func f&lt;T:P1&gt;(v:T) {
}
func f&lt;T&gt;(v:T) {
}
func f(v:S1) {
}
P1


# Page. 62

![Page Image](https://bcdn.docswell.com/page/87DY63MK7G.jpg)

プロトコルを型で指定
S1
どの実装が採用される？
func f&lt;T:P1&gt;(v:T) {
}
func f&lt;T&gt;(v:T) {
}
func f(v:P1) {
}
P1


# Page. 63

![Page Image](https://bcdn.docswell.com/page/VJP6Y4R3E8.jpg)

複数のプロトコル


# Page. 64

![Page Image](https://bcdn.docswell.com/page/2EV3GXRN7Q.jpg)

複数のプロトコル
S1
P2
protocol P1 {
}
protocol P2 {
}
struct S1 : P1, P2 {
}
P1


# Page. 65

![Page Image](https://bcdn.docswell.com/page/57G38VM5JL.jpg)

複数のプロトコル
S1
P2
どの実装が採用される？
func f(v:P1) {
}
func f(v:Any) {
}
// 該当なし？
P1


# Page. 66

![Page Image](https://bcdn.docswell.com/page/4EQ596RLJP.jpg)

複数のプロトコル
S1
P2
どの実装が採用される？
func f(v:P2) {
}
func f(v:Any) {
}
// 該当なし？
P1


# Page. 67

![Page Image](https://bcdn.docswell.com/page/KJ49X48571.jpg)

S1
複数のプロトコル
P2
どの実装が採用される？
P1
func f(v:P1) {
}
func f(v:P2) {
}
m
A
func f(v:Any) {
}
b
u
ig
s
u
o


# Page. 68

![Page Image](https://bcdn.docswell.com/page/LE1KN422JG.jpg)

複数のプロトコル
S1
P2
どの実装が採用される？
func f(v:P1) {
}
P1
• f(s1 as P1)
func f(v:P2) {
}
func f(v:Any) {
}
• f(s1 as P2)


# Page. 69

![Page Image](https://bcdn.docswell.com/page/GEWD4XR2J2.jpg)

ジェネリックで複数プロトコル


# Page. 70

![Page Image](https://bcdn.docswell.com/page/47ZG26R4E3.jpg)

複数のプロトコル
S1
P2
どの実装が採用される？
func f&lt;T:P1&gt;(v:T) {
}
func f&lt;T&gt;(v:T) {
}
// 該当なし？
P1


# Page. 71

![Page Image](https://bcdn.docswell.com/page/YJ6YV2RG7V.jpg)

複数のプロトコル
S1
P2
どの実装が採用される？
func f&lt;T:P2&gt;(v:T) {
}
func f&lt;T&gt;(v:T) {
}
// 該当なし？
P1


# Page. 72

![Page Image](https://bcdn.docswell.com/page/GJ5GD28XJ4.jpg)

S1
複数のプロトコル
P2
どの実装が採用される？
P1
func f&lt;T:P1&gt;(v:T) {
}
func f&lt;T:P2&gt;(v:T) {
s
u
}
func f(v:Any) {
}
m
A
g
i
b
o
u


# Page. 73

![Page Image](https://bcdn.docswell.com/page/LE3RMK8475.jpg)

S1
複数のプロトコル
P2
どの実装が採用される？
P1
func f&lt;T:P1&gt;(v:T) {
}
• f(s1 as P1)
func f&lt;T:P2&gt;(v:T) {
}
う
こ
func f&lt;T&gt;(v:T) {
}
！
い
な
ら
な
• f(s1 as P2)
?


# Page. 74

![Page Image](https://bcdn.docswell.com/page/8EDY63M5EG.jpg)

複数のプロトコル
S1
P2
どの実装が採用される？
func f&lt;T:P1&gt;(v:T) {
}
P1
• f(s1 as P1)
func f&lt;T:P2&gt;(v:T) {
}
func f&lt;T&gt;(v:T) {
}
• f(s1 as P2)


# Page. 75

![Page Image](https://bcdn.docswell.com/page/V7P6Y4RDJ8.jpg)

複数のプロトコル
S1
P2
どの実装が採用される？
func f&lt;T:P1&gt;(v:T) {
}
func f&lt;T:P2&gt;(v:T) {
}
func f(v:Any) {
}
P1


# Page. 76

![Page Image](https://bcdn.docswell.com/page/2JV3GXRGEQ.jpg)

複数のプロトコル
S1
P2
どの実装が採用される？
func f&lt;T:P1&gt;(v:T) {
}
func f&lt;T:P2&gt;(v:T) {
}
func f(v:Any) {
}
P1


# Page. 77

![Page Image](https://bcdn.docswell.com/page/5EG38V6D7L.jpg)

プロトコル継承


# Page. 78

![Page Image](https://bcdn.docswell.com/page/4JQ5964X7P.jpg)

プロトコル継承
S1
P2
protocol P1 {
}
protocol Q2 {
}
protocol P2 : Q2 {
}
struct S1 : P1, P2 {
}
P1
Q2


# Page. 79

![Page Image](https://bcdn.docswell.com/page/K749X4Q2E1.jpg)

ジェネリックで継承を扱う


# Page. 80

![Page Image](https://bcdn.docswell.com/page/LJ1KN4PK7G.jpg)

プロトコル継承
S1
P2
どの実装が採用される？
func f&lt;T:P1&gt;(v:T) {
}
func f&lt;T&gt;(v:T) {
}
// 該当なし？
P1
Q2


# Page. 81

![Page Image](https://bcdn.docswell.com/page/GJWD4X2P72.jpg)

プロトコル継承
S1
P2
どの実装が採用される？
func f&lt;T:P2&gt;(v:T) {
}
func f&lt;T&gt;(v:T) {
}
// 該当なし？
P1
Q2


# Page. 82

![Page Image](https://bcdn.docswell.com/page/4EZG26D6J3.jpg)

S1
プロトコル継承
P2
どの実装が採用される？
P1
func f&lt;T:P1&gt;(v:T) {
}
s
u
func f&lt;T:P2&gt;(v:T) {
}
func f(v:Any) {
}
m
A
b
o
u
ig
Q2


# Page. 83

![Page Image](https://bcdn.docswell.com/page/Y76YV21LEV.jpg)

プロトコル継承
S1
P2
どの実装が採用される？
func f&lt;T:Q2&gt;(v:T) {
}
// 該当なし？
P1
Q2


# Page. 84

![Page Image](https://bcdn.docswell.com/page/G75GD24M74.jpg)

プロトコル継承
S1
P2
どの実装が採用される？
func f&lt;T:Q2&gt;(v:T) {
}
func f&lt;T:P2&gt;(v:T) {
}
// 該当なし？
P1
Q2


# Page. 85

![Page Image](https://bcdn.docswell.com/page/9J2Y84VRJR.jpg)

S1
プロトコル継承
P2
どの実装が採用される？
P1
func f&lt;T:P1&gt;(v:T) {
}
s
u
func f&lt;T:Q2&gt;(v:T) {
}
func f(v:Any) {
}
m
A
b
o
u
ig
Q2


# Page. 86

![Page Image](https://bcdn.docswell.com/page/DEYG6M35EM.jpg)

じゃあ
クラスではどうなるのか …！


# Page. 87

![Page Image](https://bcdn.docswell.com/page/VJNGZWV478.jpg)

C1
プロトコル継承
P2
protocol P1
protocol P2 : Q2
protocol Q2
protocol R1 : Q2
class C1 : C2, P1, P2
class C2 : P1, R1
C2
P1
Q2
R1
P1
Q2


# Page. 88

![Page Image](https://bcdn.docswell.com/page/YE9WZX64E3.jpg)

クラス継承かつプロトコル継承
間に合いませんでした !


# Page. 89

![Page Image](https://bcdn.docswell.com/page/GE8N12ZV7D.jpg)

じゃあ
複数引数ではどうなるのか …！


# Page. 90

![Page Image](https://bcdn.docswell.com/page/LELPQ2DR7R.jpg)

複数引数の場合
間に合いませんでした ! !


# Page. 91

![Page Image](https://bcdn.docswell.com/page/4JM418PP7W.jpg)

ひとつだけ


# Page. 92

![Page Image](https://bcdn.docswell.com/page/PJRWL51Y79.jpg)

v1
複数条件での制約
どの実装が採用される？
func f&lt;A&gt;(v1:A, v2:A) {
}
func f&lt;A, B&gt;(v1:A, v2:B) {
}
// 該当なし？
P1
v2
P1


# Page. 93

![Page Image](https://bcdn.docswell.com/page/PEXPWKY47X.jpg)

じゃあ
プロトコル制約はどうなるのか …！


# Page. 94

![Page Image](https://bcdn.docswell.com/page/3EKDV53PJD.jpg)

プロトコル制約
想定する型の条件をプロトコルで指定
func f&lt;T:CollectionType
where Generator.Element:IntegerType&gt;(v:T) {
}
func f&lt;T:CollectionType
where Generator.Element:BooleanType&gt;(v:T) {
}


# Page. 95

![Page Image](https://bcdn.docswell.com/page/L73RMKG4J5.jpg)

where によるプロトコル制約
間に合いませんでした !!!


# Page. 96

![Page Image](https://bcdn.docswell.com/page/87DY63157G.jpg)

じゃあ
複数の制約はどうなるのか …！


# Page. 97

![Page Image](https://bcdn.docswell.com/page/VJP6Y4QDE8.jpg)

プロトコル制約
想定する型の条件を複数指定
func f&lt;T:CollectionType, U:Any
where Generator.Element:ForwardIndexType,
Generator:Element:Comparable&gt;
Generator:Element == U&gt;(v:T, w:U) {
}


# Page. 98

![Page Image](https://bcdn.docswell.com/page/2EV3GX5G7Q.jpg)

複数条件でのプロトコル制約
間に合いませんでした !!!!


# Page. 99

![Page Image](https://bcdn.docswell.com/page/57G38VPDJL.jpg)

ひとつだけ


# Page. 100

![Page Image](https://bcdn.docswell.com/page/4EQ5962XJP.jpg)

プロトコルが子を内包
PA
P
PB
protocol P1
class C1 : P1
protocol P {
class Base : P {
typealias PA
typealias PB
var v1:C1
var v2:C1
}
var v1:PA {get}
var v2:PB {get}
}


# Page. 101

![Page Image](https://bcdn.docswell.com/page/KJ49X4L271.jpg)

v1
複数条件での制約
どの実装が採用される？
v2
func f&lt;T:P1, U:P1&gt;(v1:T, v2:U) {
}
func f&lt;T:Any, U:Any&gt;(v1:T, v2:U) {
}
// 該当なし？
P1
P1


# Page. 102

![Page Image](https://bcdn.docswell.com/page/LE1KN4LKJG.jpg)

v1
複数条件での制約
どの実装が採用される？
v2
func f&lt;T:P1, U:P1&gt;(v1:T, v2:U) {
}
func f&lt;T:Any, U:Any&gt;(v1:T, v2:U) {
}
// 該当なし？
P1
Q1
P1


# Page. 103

![Page Image](https://bcdn.docswell.com/page/GEWD4XVPJ2.jpg)

P
複数条件での制約
どの実装が採用される？
func f&lt;T:P
Base P1 PA
P1 PB
where T.PA:P1, T.PB:P1&gt;(v:T) {
}
func f&lt;T:P
where T.PA:Any, T.PB:Any&gt;(v:T) {
}


# Page. 104

![Page Image](https://bcdn.docswell.com/page/47ZG2646E3.jpg)

P
複数条件での制約
どの実装が採用される？
func f&lt;T:P
Base P1 PA
Q1 PB
where T.PA:P1, T.PB:P1&gt;(v:T) {
}
func f&lt;T:P
where T.PA:Any, T.PB:Any&gt;(v:T) {
}
P1


# Page. 105

![Page Image](https://bcdn.docswell.com/page/YJ6YV23L7V.jpg)

P
複数条件での制約
どの実装が採用される？
Base P1 PA
func f&lt;T:P
P1 PB
where T.PA == T.PB&gt;(v:T) {
}
func f&lt;T:P
where T.PA:Any, T.PB:Any&gt;(v:T) {
}


# Page. 106

![Page Image](https://bcdn.docswell.com/page/GJ5GD2LMJ4.jpg)

P
複数条件での制約
どの実装が採用される？
Base P1 PA
func f&lt;T:P where T.PA:P1, T.PB:P1,
Q1 PB
T.PA == T.PB&gt;(v:T) {
}
func f&lt;T:P
where T.PA:Any, T.PB:Any&gt;(v:T) {
}
P1


# Page. 107

![Page Image](https://bcdn.docswell.com/page/9E2Y84LRER.jpg)

じゃあ
プロトコル拡張はどうなるのか …！


# Page. 108

![Page Image](https://bcdn.docswell.com/page/D7YG6MQ57M.jpg)

プロトコル拡張
プロトコルに既定の実装を追加
extension CollectionType
where Generator.Element : IntegerType {
var sum:Generator.Element {
return self.reduce(0, combine: +)
}
}


# Page. 109

![Page Image](https://bcdn.docswell.com/page/VENGZWK4J8.jpg)

プロトコル拡張
間に合いませんでした !!!!!


# Page. 110

![Page Image](https://bcdn.docswell.com/page/Y79WZXV473.jpg)

型の拡張
構造体
プロトコ
ル継承
プロトコ
ル拡張
型の直指定
複数プロ
トコル
クラス
とにかく
混沌としている世界
クラス継承
とプロトコル
クラス継承
ジェネリッ
クでの指定
プロトコル
型で縛る


# Page. 111

![Page Image](https://bcdn.docswell.com/page/G78N12PVJD.jpg)

統べるのは
至難の業かもしれない
to be continued


