🐶
【Swift】スタティックメソッドとインスタンスメソッドのselfを整理する
はじめに
先日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