Swift プロトコル、パート1

プロトコルの基本

プロトコルの定義方法

プロトコルの定義
protocol プロトコル名{ プロトコルの中身を定義 }

構造体・クラス・列挙型などの型がプロトコルAに準拠するとプロトコルAの持つ機能・特性を準拠した型も持つことができます。

プロトコルAに準拠する方法

プロトコルへ準拠した型を定義する
struct 構造体名 : プロトコル名1,プロトコル名2{ 構造体の中身の定義 }

複数のプロトコルに準拠した型を定義する場合は上記のように,(カンマ)で区切って記述します。

上記のように記述したうえで、準拠するプロトコルが要求するプロパティ・メソッドなどを型の中で実装すれば、プロトコルに準拠した型を定義できます。

sample1

protocol ProtocolA{
    func methA()
}

struct StructA:ProtocolA{
    func methA(){
        
    }
}

sample1ではProtocolAという名のプロトコルを定義し、次にProtocolAに準拠した構造体StructAを定義しています。

ProtocolAは、準拠する型(StructA)に、メソッドmethA()の実装を要求していますので、StructAの定義内でメソッドmethA()を定義する必要があります。

プロトコルが要求するプロパティ・メソッドを準拠する型内で定義していないとコンパイルエラーとなります。(sample2)

sample2

protocol ProtocolA{
    func methA()
    func methB()
}

struct StructA:ProtocolA{
    func methA(){
        
    }
}
main.swift:7:8: error: type 'StructA' does not conform to protocol 'ProtocolA'
struct StructA:ProtocolA{
       ^

sample2ではProtocolAが二つのメソッド

methA()

methB()

の実装を要求していますが、準拠する構造体StructA型ではmethA()しか実装していませんので、「(メソッドが足りないので)'StructA'は'ProtocolA'に準拠していません」というエラーが出ています。


sample3

protocol ProtocolA{
    func methA()
    func methB()
}

class SuperA{
    
}

class ClassA:SuperA,ProtocolA{
    func methA(){}
    func methB(){}
}

「クラスの継承」と「プロトコルへの準拠」を同時にしたい場合はsample3のように記述します。sample3ではClassAクラスがSuperAクラスを継承し、同時にProtocolAプロトコルへ準拠しています。

class クラス名:スーパークラス名,プロトコル名1,プロトコル名2{
    クラスの定義
}

 

コメントを残す

メールアドレスが公開されることはありません。