見出し画像

Swiftを始めよう! - Protocols and Extensions

"プロトコル"ってなんだということからです。以下日本語で説明があります。簡単にいうと、基本の雛形、必ず欲しい機能などをあらかじめ決めておくことで間違いなく実装できる仕組み。プロトコルを使ってクラス、構造体などを作ることをconform(日本語では準拠など)と呼びます。

プロトコル

を宣言します。

    protocol ExampleProtocol {
        var simpleDescription: String { get }
        mutating func adjust()
    }

この型を使いクラス(class)、構造体(struct)を、enumを作ることができます。

var simpleDescription: String { get } ・・・ プロパティ
mutating func adjust()       ・・・ メソッド

1つのプロパティと1つのメソッド(関数)を持つことが約束されます。

クラス

class SimpleClass: ExampleProtocol {
        var simpleDescription: String = "A very simple class."
        var anotherProperty: Int = 69105
        func adjust() {
            simpleDescription += "  Now 100% adjusted."
        }
    }

構造体

  struct SimpleStructure: ExampleProtocol {
        var simpleDescription: String = "A simple structure"
        mutating func adjust() {
            simpleDescription += " (adjusted)"
        }
    }

ここで使い方でクラスと構造体の違いがあります。プロトコルではメソッドが

mutating func adjust()

となっています。構造体はこの"mutating"がついていますがクラスではついていません。違いは構造体は基本変更できないも、クラスは変更可能なものということ。変更できないものを変更できるようにするのが"mutating"で、構造体で使います。

使い方は

クラス

 var a = SimpleClass()
 a.adjust()
 let aDescription = a.simpleDescription

構造体

  var b = SimpleStructure()
  b.adjust()
  let bDescription = b.simpleDescription

同じように使えます。

Extension

最初から決められている型(Int、String)などに機能が追加できます。以下は整数を表す"Int"の機能拡張をExampleProtocolを利用して行なっています。

    extension Int: ExampleProtocol {
        var simpleDescription: String {
            return "The number \(self)"
        }
        mutating func adjust() {
            self += 42
        }
    }

こうすることで

整数"7"にExampleProtocolで定義したプロトコルが以下のように使えるようになります。

  print(7.simpleDescription)

とすると

var simpleDescription: String {
  return "The number \(self)"
}

が適応されているので、"The number 7"と出力されます。

実装済みのクラスを代入した場合でもプロトコル準拠に従うため、実装ずみのメソッドやプロパティであってもアクセスできません。

    let protocolValue: ExampleProtocol = a

"a"が代入されていますExampleProtocolに準拠するために

protocolValue.simpleDescription

を実行すると以下出力される。

"A very simple class. Now 100% adjusted."

print(protocolValue.anotherProperty)  

を実行すると"ExampleProtocol"には"anotherProperty"がないためエラーになります。

この記事が気に入ったらサポートをしてみませんか?