プロトコル(protocol)と拡張(extension)

トップページ » プロトコル(protocol)と拡張(extension)

11 Jun 2014 10:51公開

プロトコルと拡張を紹介します。

プロトコル Protocol

protocolのキーダードでプロトコルを宣言します。

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

クラス、列挙型、および構造体すべては、プロトコルを利用することができます。

mutatingキーワードはクラスのプロパティーを変更できるように宣言します。ところで、クラス自身のメソッドはmutatingで宣言する必要がありません。全てのクラスメソッドはクラスのステータスを変更できます。

class SimpleClass: ExampleProtocol {
 var simpleDescription: String = "A very simple class."
 var anotherProperty: Int = 69105
 func adjust() {
  simpleDescription += " Now 100% adjusted."
 }
}
var a = SimpleClass()
a.adjust()
 
let aDescription = a.simpleDescription
 struct SimpleStructure: ExampleProtocol {
  var simpleDescription: String = "A simple structure"
  mutating func adjust() {
   simpleDescription += " (adjusted)"
  }
}
var b = SimpleStructure()
b.adjust()
let bDescription = b.simpleDescription

拡張 Extension

拡張 Extension は既存のソースコードにメソッド、プロパティーなど機能を追加できます。ライブラリとフレームワークからインポートしたクラスの機能も変更できます。

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

プロトコル名を他のタイプと同じように使えます。例えばコレクションに格納されるオブジェクトのタイプはそれぞれですが、全てのオブジェクトは同じプロトコルを実装していれば、大丈夫です。

ただし、プロトコルの外部に定義されたメソッドは、プロトコロでは利用できません。

let protocolValue: ExampleProtocol = a
protocolValue.simpleDescription
// protocolValue.anotherProperty // コメントを外せば、エラーの確認ができます。

シリーズ

記事のリスト

  • プロトコル(protocol)と拡張(extension)

レーティング

rating: 0+x

コメント

Add a New Comment
当サイトコンテンツライセンスについて個別な指定がなければCreative Commons Attribution-ShareAlike 3.0 Licenseをベースします。転載や引用は大歓迎です。但し、転載・引用・二次利用の場合は当サイト記事へのURLをリンクし出典を明記してください。各作品を大切にして下さい。 また、記事及びコメントを投稿する皆さまも上記のライセンスを理解した上投稿して下さい。 当サイトのコンテンツは皆さまの投稿で作成されますから、当サイトの意思を反映しておりませんが、第三者の知的財産権などの侵害がある場合、当サイトの運営担当にご連絡ください。