#プロトコルはクラスや構造体の根本的な定義を宣言するための機能です。#
そのためプロトコルだけでの実装はできません。プロトコルを宣言したらそれをクラスで適合させます。
import Foundation
//プロトコルを定義
protocol FooProtocol {
var foo: String { get }
func goo()
}
//クラスでプロトコルを適合
class test : FooProtocol{
var foo = "bye!"
func goo (){
}
}
プロトコルを適合したクラス(又は構造体)はプロトコルに書いてあることを含んでいないと「Type "test" does not comform to protocol "FooProtocl" (クラスがプロトコルに適合していません)」というエラーがでます。
またプロトコルは拡張ができます。
import Foundation
protocol FooProtocol {
var foo: String { get }
func goo()
}
extension FooProtocol {
func goo(red :Int, green :Int, blue :Int) -> String {
return String(red, green, blue)
}
}
class test : FooProtocol{
var foo = "bye!"
func goo(){}
}
var aClass = test()
print(aClass.foo) //bye!
protocolでは直接メソッドを定義できないため(メソッド名と引数、戻り値の型だけ指定)、extension中で行う必要があります。
import Foundation
struct EqualCheck<T: SignedNumberType> {
let aaa: T
let bbb: T
}
extension EqualCheck: Equatable {}
func ==<T>(lhs: EqualCheck<T>, rhs: EqualCheck<T>) -> Bool {
return lhs.aaa == rhs.aaa && lhs.bbb == rhs.bbb
}
let a = EqualCheck<Double>(aaa: 1.0, bbb: 2.0)
let b = EqualCheck<Double>(aaa: 1.0, bbb: 2.0)
a == b // true
a != b // false
Swift標準ライブラリにあるプロトコルEquatableを使った例です。
Equatableによりvalueの比較をする実装が求められます。
クラスで継承を行うよりもプロトコルの宣言を行い、それを使ってクラスや構造体を組み立てる方が実装に規則性がありクリーンになるかもしれません。
WWDC2015においてもプロトコル指向プログラミングの有用性が発表されていましたね。