selfとSelfとは?
selfとは?
型の内部のプロパティやメソッドなどの中ではselfキーワードを通じてインスタンス自身にアクセスできます!
例
class Person {
let personName = "ひなっこ"
func sayName() {
print(self.personName)
}
}
Selfとは?
型の内部のプロパティやメソッドなどの中ではSelfキーワードを通じて型自身にアクセスできます!
Selfキーワードを使うと、型自身に紐づくメンバーであるstaticメソッド、staticプロパティにアクセスできる。
インスタンス化してない状態でアクセスできます!
class Person {
static let raceName = "日本人"
func sayName() {
print("私は\(Self.raceName)です。")
}
}
selfとSelfの違いを見てみる!
理解を深めるためにPlaygroundで動かしてみてください!
class Person {
static let raceName = "日本人"
let name: String
init(name: String) {
self.name = name
}
func sayMyName() {
print("私の名前は\(self.name)です。私は\(Self.raceName)です。")
//🟩SelfはPersonに置き換え可能
//print("私の名前は\(self.name)です。私は\(Person.raceName)です。")
}
}
//🟥エラー:Cannot find 'hinakko' in scope
//print(hinakko.name)
print(Person.raceName)//日本人
func f() {
let hinakko = Person(name: "ひなっこ")
hinakko.sayMyName()//私の名前はひなっこです。私は日本人です
print(hinakko.name)//ひなっこ
print(Person.raceName)//日本人
}
f()
Playgroundで動かしてみると、
🟥エラー:Cannot find 'hinakko' in scopeの下のprint(hinakko.name)でエラーが起こります!
インスタンス化されていないため、エラーになります!
一つ下のprint(Person.raceName)は型に紐づいているため、正常にprintされます。
そのため、sayMyNameメソッドのprint("私の名前は(self.name)です。私は(Self.raceName)です。")
🟩Selfは型自身にアクセスするため、Personに置き換え可能
❌selfはインスタンス自身にアクセスするので、Personに置き換えは不可
参考文献