LoginSignup
20
20

More than 5 years have passed since last update.

Swiftでプロトコル指向プログラミング

Last updated at Posted at 2015-08-08

プロトコルはクラスや構造体の根本的な定義を宣言するための機能です。

そのためプロトコルだけでの実装はできません。プロトコルを宣言したらそれをクラスで適合させます。


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においてもプロトコル指向プログラミングの有用性が発表されていましたね。

20
20
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
20
20