Caution

お使いのブラウザはJavaScriptが実行できない状態になっております。
当サイトはWebプログラミングの情報サイトの為、
JavaScriptが実行できない環境では正しいコンテンツが提供出来ません。
JavaScriptが実行可能な状態でご閲覧頂くようお願い申し上げます。

Swift辞典

  1. トップページ
  2. Swift辞典
  3. protocol の基本 / 準拠

protocol の基本 / 準拠

Swiftの『protocol』(プロトコル)は、型が満たすべきメソッドやプロパティの要件を定義するインターフェースです。struct・class・enum が準拠できます。

構文
// プロトコルの定義
protocol プロトコル名 {
    // 必須プロパティ({ get } または { get set })
    var プロパティ: 型 { get }
    var 読み書き: 型 { get set }

    // 必須メソッド
    func メソッド名() -> 型

    // mutating メソッド(struct 対応)
    mutating func 変更メソッド()
}

// プロトコルへの準拠
struct 型名: プロトコル名 {
    // プロトコルの要件を実装する
}
構文一覧
構文概要
protocol 名前 { }プロトコルを定義します。
var prop: T { get }読み取り専用プロパティの要件を宣言します。
var prop: T { get set }読み書き可能なプロパティの要件を宣言します。
func メソッド()必須メソッドの要件を宣言します。
struct 型: プロトコル { }プロトコルに準拠する型を定義します。
& によるプロトコル合成複数のプロトコルに準拠する型を表します(protocol1 & protocol2)。
サンプルコード
// プロトコルの定義
protocol Describable {
    var description: String { get }
    func describe()
}

protocol Resizable {
    mutating func resize(by factor: Double)
    var area: Double { get }
}

// struct がプロトコルに準拠
struct Circle: Describable, Resizable {
    var radius: Double

    var description: String {
        return "円(半径: \(radius))"
    }

    func describe() {
        print(description)
    }

    var area: Double {
        return Double.pi * radius * radius
    }

    mutating func resize(by factor: Double) {
        radius *= factor
    }
}

var circle = Circle(radius: 5.0)
circle.describe()
print("面積: \(String(format: "%.2f", circle.area))")

circle.resize(by: 2.0)
circle.describe()

// プロトコル型として使用
func printInfo(_ item: Describable) {
    item.describe()
}

printInfo(circle)

// プロトコル合成(& 演算子)
func resizeAndDescribe(_ item: inout Describable & Resizable, by factor: Double) {
    item.resize(by: factor)
    item.describe()
}
概要

プロトコルは「何ができるか」を定義します。異なる型に同じプロトコルを準拠させることで、ポリモーフィズムを実現できます。

プロトコルのプロパティ要件に『{ get }』と書いた場合でも、準拠する型は格納型プロパティや計算型プロパティとして実装できます。プロトコルに定義された mutating メソッドは struct や enum が準拠する場合に必要です。class が準拠する場合は mutating を省略できます。

プロトコルのデフォルト実装についてはprotocol のデフォルト実装 / プロトコル合成を参照してください。

記事の間違いや著作権の侵害等ございましたらお手数ですがまでご連絡頂ければ幸いです。