2014年10月30日
Posted by 屋台ブルー at
2014年10月30日00:00 Comment(0)
Swiftで遊ぼう! - 111 - Swift Fundamentals本 プロトコール
z「Swift Fundamentals: The Language of iOS Development - スイフト:基本」はまだまだ続く。
今日の話題は以前から理解に苦しんでいたプロトコールの話だ。他のプログラミング言語では、「インターフェイス」と呼ばれているけど、機能性を後で与える必要のあるメソッドやプロパティの設計図(ブループリント)である。
私が苦しんでいるプロトーコール関連のポスト
Swiftで遊ぼう! - 27 プロトコール、イニシャライズで疲れました
Swiftで遊ぼう! - 28 プロトコールの理解も時間がかかりそう
Swiftで遊ぼう! - 31 プロトコールをなんとかして理解したい.
Swiftで遊ぼう! - 32 プロトコールまだまだ...
プロトコールの基本的な使い方は少しわかってきたと思う。悩んで考えてやっと基本的な使い方が理解できてきた。
Swiftで遊ぼう! - 74 オブジェクト指向1 ポリモーフィズム
この時悩んで実装できなかったプロトコールを使ったプログラミングをしてみよう。
protocol Call {
func callName()
}
class Person:Call {
var name: String
init(name: String) {
self.name = name
}
func callName() {
}
}
class Man:Person {
override init(name: String) {
super.init(name: name)
}
override func callName() {
println("My name is \(name) and I'm a Guy!")
}
}
class Woman:Person {
override init(name: String) {
super.init(name: name)
}
override func callName() {
println("My name is \(name) and I'm a Lady!")
}
}
class Spaceman:Call {
var name: String
init(name: String) {
self.name = name
}
func callName() {
println("My name is \(name) and I come from outer space!")
}
}
var yuji = Man(name: "Yuji Tai")
var miyuki = Woman(name: "Miyuki Tai")
var et = Spaceman(name: "E.T.")
yuji.callName() //My name is Yuji Tai and I'm a Guy!
miyuki.callName() //My name is Miyuki Tai and I'm a Lady!
et.callName() //My name is E.T. and I come from outer space!
メソッドcallName()の挙動を変えてみました。
ここで重要なポイントを説明しておこう。インスタンスのyujiとmiyukiは共通の親クラスPersonを持ちますが、インスタンスetは別クラスのSpacemanです。異なるクラスでも共通のメインルーチンとして働くプロトコールCallを実装することで共通のインターフェイスを持つことができたのです。
今のところ私が理解しているプロトコールはここまでです。
じゃあ章末の問題を解きましょう。
Questions for Review - 復習のための質問
1. プロトコールを定義した時にメソッドの実装が必要ですか?
a) はい
b) いいえ
これは(b)ですよね。プロトコールはブループリントですね。
2. プロトコールは同じ継承内のクラスの中に組み込まなければならない。
a) 正しい
b) 間違い
これがプロトコールの最も重要なポイントですよね。同じクラス内で使うということは親クラスを共通メインルーチンとして使うことができる「継承」の使い方になり、異なるクラスで共通メインルーチンを拡張させているのがプロトコールで、ポリモーフィズムという訳です。ということで(b)の間違い。
3.Xcodeは、プロトコールが組み込まれていても実装されていないクラスに対してどんな反応をしますか?
a) Xcodeはプロトコールで組み込まれた要素から骨格を作り出す。
b) Xcodeはエラーを生成する。
c) Xcodeは実装されていないプロトコールは無視する。
d) Xcodeはクラス自体を無視する。
これは(b)のエラーが生じるので必ず実装しなければならない。例え「何もしない」という実装でもしなければならない。
4. プロトコールは与えられたクラスで特定の実装をどうやってすべきか決めることができる。
a) 正しい
b) 間違い
ちょっと問題文がわかりにくいけど、プロトコールの実装はクラスがするものでありプロトコール自身はなんの決定権も持たない。
今日はここまで。
今日の話題は以前から理解に苦しんでいたプロトコールの話だ。他のプログラミング言語では、「インターフェイス」と呼ばれているけど、機能性を後で与える必要のあるメソッドやプロパティの設計図(ブループリント)である。
私が苦しんでいるプロトーコール関連のポスト
Swiftで遊ぼう! - 27 プロトコール、イニシャライズで疲れました
Swiftで遊ぼう! - 28 プロトコールの理解も時間がかかりそう
Swiftで遊ぼう! - 31 プロトコールをなんとかして理解したい.
Swiftで遊ぼう! - 32 プロトコールまだまだ...
プロトコールの基本的な使い方は少しわかってきたと思う。悩んで考えてやっと基本的な使い方が理解できてきた。
Swiftで遊ぼう! - 74 オブジェクト指向1 ポリモーフィズム
この時悩んで実装できなかったプロトコールを使ったプログラミングをしてみよう。
protocol Call {
func callName()
}
class Person:Call {
var name: String
init(name: String) {
self.name = name
}
func callName() {
}
}
class Man:Person {
override init(name: String) {
super.init(name: name)
}
override func callName() {
println("My name is \(name) and I'm a Guy!")
}
}
class Woman:Person {
override init(name: String) {
super.init(name: name)
}
override func callName() {
println("My name is \(name) and I'm a Lady!")
}
}
class Spaceman:Call {
var name: String
init(name: String) {
self.name = name
}
func callName() {
println("My name is \(name) and I come from outer space!")
}
}
var yuji = Man(name: "Yuji Tai")
var miyuki = Woman(name: "Miyuki Tai")
var et = Spaceman(name: "E.T.")
yuji.callName() //My name is Yuji Tai and I'm a Guy!
miyuki.callName() //My name is Miyuki Tai and I'm a Lady!
et.callName() //My name is E.T. and I come from outer space!
メソッドcallName()の挙動を変えてみました。
ここで重要なポイントを説明しておこう。インスタンスのyujiとmiyukiは共通の親クラスPersonを持ちますが、インスタンスetは別クラスのSpacemanです。異なるクラスでも共通のメインルーチンとして働くプロトコールCallを実装することで共通のインターフェイスを持つことができたのです。
今のところ私が理解しているプロトコールはここまでです。
じゃあ章末の問題を解きましょう。
Questions for Review - 復習のための質問
1. プロトコールを定義した時にメソッドの実装が必要ですか?
a) はい
b) いいえ
これは(b)ですよね。プロトコールはブループリントですね。
2. プロトコールは同じ継承内のクラスの中に組み込まなければならない。
a) 正しい
b) 間違い
これがプロトコールの最も重要なポイントですよね。同じクラス内で使うということは親クラスを共通メインルーチンとして使うことができる「継承」の使い方になり、異なるクラスで共通メインルーチンを拡張させているのがプロトコールで、ポリモーフィズムという訳です。ということで(b)の間違い。
3.Xcodeは、プロトコールが組み込まれていても実装されていないクラスに対してどんな反応をしますか?
a) Xcodeはプロトコールで組み込まれた要素から骨格を作り出す。
b) Xcodeはエラーを生成する。
c) Xcodeは実装されていないプロトコールは無視する。
d) Xcodeはクラス自体を無視する。
これは(b)のエラーが生じるので必ず実装しなければならない。例え「何もしない」という実装でもしなければならない。
4. プロトコールは与えられたクラスで特定の実装をどうやってすべきか決めることができる。
a) 正しい
b) 間違い
ちょっと問題文がわかりにくいけど、プロトコールの実装はクラスがするものでありプロトコール自身はなんの決定権も持たない。
今日はここまで。