【Swift】プロトコル解説!プロトコルってなに??

Swift

Swiftを学習していてプロトコルが出てきた時に「なんのためにあるの?」って思ったことないですか?

なんとなく分かったような分からないような感じですよね。

自分の理解も含めて使い方をまとめていこうと思います!!!

プロトコル

実装させたい変数、関数を定義しておき構造体で実装させるためのものです。

(他言語習得者の人に聞き馴染みがあるのは、インターフェースとか抽象メソッドのイメージです。)

基本的にプロトコルだけで実装するものではありません。構造体と一緒に用います。

プロトコル内には、必ず実装して欲しい変数や関数を定義しておきます。ただし、プロトコル内には詳細な実装は行いません。詳細な実装を行うのは構造体内わせます。

(ちなみに、、、このようなことを「インターフェース」とかというのですが、言葉は正直どうでもいいと思っています。。まずはイメージが大事なので!!)

プロトコルの書き方

プロトコルの書き方は以下になります

protocol Protocol1{
    // 定数の宣言をする場合
    var 変数名: 型 { get }
    // 変数の宣言
    var 変数名: 型 { get, set }
    // 関数の定義
    func 関数名()
}

なんか、あんまりイメージわかないと思うのでコードで見て説明を聞いた方がわかりやすいと思います。

今のコードを見ながら解説していきます。

protocol Protocol1{
    // 定数の宣言
    var protocol1Property: Int { get }
    // 変数の宣言
    var protocol1Property2: Int { get, set }
    // 関数の定義
    func protocol1Method()
}

struct sampleStruct: Protocol1{
    var protocol1Property: Int
    var protocol1Property2: Int
    func protocol1Method() {
        print("protocol1Method")
    }
}

protocol〜の部分が、プロトコルの宣言部分です。Protocol1というプロトコルを宣言しています。

中身を確認するとちょっと特殊です。

変数宣言部分

まずはprotocsal1Propertyを見て下さい。

この部分では、一見普通の変数宣言かと思われますが、型宣言以下(Int〜)の部分が異なります。

{get}となっていると思います。この部分は、宣言した変数が構造体の中で実装した際に、定数として扱うのか?変数として扱うのかを表しています。getだけの場合には定数扱いとなります。

変数の時はどうするのか?はprotocol1Property2を見て下さい。

{get, set}となっていると思います。この場合、構造体内で実装した場合に変数として扱われます。

関数部分

変数宣言部分の下に、関数宣言部分があると思います。

こちらも、普通の関数宣言と比べると特殊です。

処理が何一つ書いてないのです!!プロトコル内では実装は記載しません。

あえて処理を書かないでこの関数名のものを実装してね!処理は構造体内で好きに決めていいよ!!!

としているわけですね。

構造体での実装

構造体として宣言したsampleStructを見て下さい。

この構造体の中で、それぞの変数、関数の詳細な実装をしていることを見て下さい。

変数の実装

変数の実装では、protocol1Propertyを定数として、protocol1Property2を代入可能な変数として宣言しています。

関数の実装

protocol1Methodメソッドの中身を構造体の中で実装しています。

今回の実装ではただのprint分の実装ですが、このようにしてプロトコルで曖昧に定義したものの中身を構造体の中で記載します。

複数プロトコルの実装

一つの構造体に対して、プロトコルは複数実装することができます。

以下のようになります。

protocol Protocol1{
    // 定数の宣言
    var protocol1Property: Int { get }
    // メソッドの定義
    func protocol1Method()
}

protocol Protocol2{
    // 定数の宣言
    var protocol2Property: Int { get }
    // メソッドの定義
    func protocol2Method()
}



struct sampleStruct: Protocol1,Protocol2{
    var protocol1Property: Int
    var protocol2Property: Int
    func protocol1Method() {
        print("protocol1Method")
    }
    func protocol2Method() {
        print("protocol2Method")
    }
}

終わりに

プロトコルに関して見てきました。

このようにして、プロトコルでは構造体に対して実装させたい変数、関数を定義しておけます。

プロトコルを使う利点ですが、あるプロトコルを実装した構造体には必ずこの変数や、関数が実装されているということが確約できるという点が大きいです。

絶対に構造体に含めなければならない変数、関数を忘れることがなくなるという利点があります。

プロトコルを使いこなすのは確かに難しですが、学習の最初は難しく考えずに上記説明した理解程度にしておいて、後々になってより理解を深めると良いと思います。

コメント

タイトルとURLをコピーしました