💻

Swift Method入門

2023/05/26に公開

Swiftという言語にはMethodという概念があります。

Methodというのは特定の型に関連付けられた関数で、下記のような2種類があります。

種別 説明
Instance Medhod 特定の型のインスタンスを操作するための特定のタスクと機能をカプセル化するMethod
Type Method 型自体に関連付けられたMethod

上記は下記のように定義できます。

種別 Struct Class Enum
Instance Medhod 定義可能 定義可能 定義可能
Type Method 定義可能 定義可能 定義可能

Instance Method

Instance Methodは、下記2つの方法で、インスタンスの機能をサポートします。

  1. インスタンスのプロパティにアクセスして変更する方法を提供する
  2. インスタンスの目的に関連する機能を提供する

このMethodは、すでに存在する特定の型のInstanceでのみ呼び出すことが可能です。

Instance Methodにおける self プロパティ

Instance Methodでは自分自身を表すself という特別なプロパティがあります。
このselfは自分のインスタンス自身を示します。

通常明示的にself キーワードを記述する必要はありませんが、関数の引数が自分自身のプロパティと重複する場合などには区別のために記述する必要があります。

class SomeClass {
    var someString: String
    
    init(someString: String) {
        self.someString = someString
    }
}

Type Method

インスタンスではなく、型そのものに対して呼び出しが可能なメソッドが、Type Methodです。

Swiftでは、static を関数の前につけることで Type Methodを定義します

struct SomeStruct {
    static func fire() {
        // do something here...
    }

Type Methodを実装する対象がClassの場合、static ではなくclass を利用することで、サブクラスがオーバーライドできるように定義することも可能です。

class SomeParent {
    class func fire() {
        // do something here...
    }
}

このとき、サブクラス側でのオーバーライドを意図しない場合はfinal をつけることでサブクラスによるoverrideをできなくすることが可能です。

class SomeParent { 
    final class func fire() {
        // do something here...
    }
}

class SomeChild: SomeParent {
    override class func fire() {
        // error: class method overrides a 'final' class method になりビルドできない
    }
}

Type Methodにおける self プロパティ

Type Methodにも暗黙的な self プロパティは存在しますが、このときのselfは型そのものを表します。

そのため下記のようなコードはビルドできません。

struct SomeStruct {
    var someString: String
    
    static func fetch() -> String {
        return self.someString // error: instance member 'someString' cannot be used on type 'SomeStruct' になりビルドできない
    }
}

参考資料

Discussion