はじめに
いままでclassとstructの違いをしっかり調べたことがなかったのでまとめてみました
違い1(初期化)
class
class
はイニシャライザが必須です。
ないと怒られます
class PersonClass {
var name: String
init(name: String) {
self.name = name
}
}
struct
struct
は自動初期化されるらしく、イニシャライザはなくても怒られません。
もちろんあっても良いです
struct PersonStruct {
var name: String
}
違い2(値型と参照型)
class
class PersonClass {
var name: String
init(name: String) {
self.name = name
}
}
let personClass1 = PersonClass(name: "めぐみ")
let personClass2 = personClass1
personClass2.name = "たろう" // `personClass2`の`name`を「たろう」に変える
// そうすると、、、
print(personClass1.name) // `personClass1`の`name`も「たろう」に変わる
struct
struct PersonStruct {
var name: String
}
var personStruct1 = PersonStruct(name: "めぐみ")
var personStruct2 = personStruct1
personStruct2.name = "たろう" // `personClass2`の`name`を「たろう」に変える
// そうしても、、、
print(personStruct1.name) // `personClass1`の`name`は「めぐみ」のまま
違い3(継承)
class
class PersonClass {
var name: String
init(name: String) {
self.name = name
}
func introduction() {
print("私は\(name)です")
}
}
class StudentClass: PersonClass {
var id: String
init(name: String, id: String) {
self.id = id
super.init(name: name) // ここは`PersonClass`のイニシャライザ
}
override func introduction() {
print("私は\(name)です。生徒番号は\(id)です。")
}
}
let student = StudentClass(name: "たけし", id: "123456")
student.introduction() // 私はたけしです。生徒番号は123456です。
struct
できない
違い3(可変性)
class
class PersonClass {
var name: String
init(name: String) {
self.name = name
}
func rename(newName: String) {
self.name = newName
}
}
var personClass = PersonClass(name: "めぐみ")
personClass.rename(newName: "たけし")
print(personClass.name) // たけし
struct
自身のプロパティを変更したいときには、メソッドにmutating
が必須
struct PersonStruct {
var name: String
mutating func rename(newName: String) {
self.name = newName
}
}
var personStruct = PersonStruct(name: "めぐみ")
personStruct.rename(newName: "たけし")
print(personStruct.name) // たけし
おわり
ここら辺複雑でむずいです。
理解していないと予期せぬバグを生み出しそうなのでちゃんと勉強します。。。
足りないことや間違ってることがあればコメントで教えてくれると助かります