プロトコル・extension - Swift
最終更新日: 2026-07-26
TOP(About this memo)) > 一覧(Swift) > プロトコル・extension
プロトコル
- JavaやC#でいうインターフェース。
- クラスだけでなく、構造体や列挙型にも使える。
- クラスにプロトコルを適合させる場合、そのクラスがスーパークラスを持っている場合は、スーパークラス名の後にプロトコル名を書く。
class SomeClass: SuperClass, SomeProtocol, AnotherProtocol {
// 〜
}
- プロパティ
- プロパティ名、型、ゲッタとセッタの有無のみを定義する。
- プロパティは常にvarキーワードで宣言する。letは使えない。プロトコルのプロパティにはストアドプロパティやコンピューテッドプロパティの区別がないため。
var プロパティ名: 型 { get set }
{ get } または { get set } が定義されていないとエラーになる。
- プロトコル側でsetterがある場合に、準拠側で定数(letで定義)にするとエラーになる。プロトコル側がgetterのみならOK。
- メソッド
- インスタンスメソッド、型メソッドがある。
- メソッド名・引数の型・戻り値の型のみを定義する。
func 関数名(引数) -> 戻り値の型
- mutating
- 変更し得るメソッドを定義する場合には、mutatingキーワードを追加して定義する。
- 値型で準拠させるとき
- プロトコルの定義にmutatingキーワードがついていない場合は、準拠する側でmutatingキーワードをつけることができない。
- プロトコルの定義にmutatingキーワードがついていたとしても、準拠する側でmutatingキーワードをつけなくてもよい。
- 参照型で準拠させるとき
- プロトコルの定義にmutatingキーワードがあってもなくても、準拠する側でmutatingキーワードは不要(参照型はそもそもmutatingキーワードを使えない)。
- インスタンスプロパティや型プロパティ
- プロトコルにインスタンスプロパティや型プロパティを定義できる。
- 実装する側では保持型プロパティと計算型プロパティのどちらで実装してもOK。
var completed: Int { get set } // インスタンスプロパティ
class var numberOfProcessing: Int { get set } // 型プロパティ
- 連想型(associatedtype)
- プロトコルのプロパティやメソッドの型を実装時に決めることができる(ジェネリクス的なもの)。詳細はジェネリクスを参照。
- 連想型には、プロトコルやスーパークラスで制約をつけたり、デフォルト値を指定することができる。
- プロトコルは他のプロトコルを継承することができる。
- プロトコルの継承は、単純に継承元のプロトコルで定義されているプロパティやメソッドなどをプロトコルに引き継ぐだけ。
- クラスのオーバーライドのような概念はない。
- (参考) https://qiita.com/onishi_820/items/b913f47436ff02dacb8f
- (参考) https://tea-leaves.jp/swift/content/%E3%83%97%E3%83%AD%E3%83%88%E3%82%B3%E3%83%AB
extension(WIP)
- 定義済みの構造体やクラス、列挙型、プロトコルの機能を拡張する。
- StringやViewなど標準ライブラリに組み込まれているクラスなどにも拡張して機能を持たせることができる。
- 拡張できるもの
- インスタンスプロパティで、ストアドプロパティ・コンピューテッドプロパティ
- タイププロパティで、コンピューテッドプロパティ
- インスタンスメソッド/タイプメソッド
- イニシャライザ
- プロトコルへの準拠
- サブスクリプト
- ネストされた型
- 例
- SwiftUIのViewを拡張して汎用性の高いmodifierを作成する(UIを参照)。
- (参考) https://tech.amefure.com/swift-extension