🐶

【Swift】スタティックメソッドとインスタンスメソッドのselfを整理する

2022/11/12に公開

はじめに

先日Cannot convert value of type 'xxx' to closure result type 'xxx.Type'というエラーが発生しました。
この時はスタティックメソッドでのselfの扱いが原因でした。
スタティックメソッドのselfについて改めて考えたことないなと思い、selfキーワードについて整理します。

環境

Xcode14.1
Swift5

selfを比べる

スタティックメソッドとインスタンスメソッドそれぞれのselfとselfの型を出力してみます。

struct Sample {
    func sampleInstanceMethod() {
        print("インスタンスメソッドのself: \(self)")
        print("インスタンスメソッドのtype(of: self): \(type(of: self))")
    }
    static func sampleStaticMethod() {
        print("スタティックメソッドのself: \(self)")
        print("スタティックメソッドのtype(of: self): \(type(of: self))")
    }
}

let sample = Sample()
sample.sampleInstanceMethod()
Sample.sampleStaticMethod()

出力結果

インスタンスメソッドのself: Sample()
インスタンスメソッドのtype(of: self): Sample
スタティックメソッドのself: Sample
スタティックメソッドのtype(of: self): Sample.Type

続いて各メソッド内でBreakpointを追加しpo selfを確認します。
sampleInstanceMethodの場合

(lldb) po self
プロジェクト名.Sample()

sampleStaticMethodの場合

(lldb) po self
プロジェクト名.Sample

まとめ

インスタンスメソッドのselfはインスタンス自身であり、スタティックメソッドのselfは型そのものを指します。

Discussion