LoginSignup
7
iOS強化月間 - iOSアプリ開発の知見を共有しよう -

【Swift】classとstructの違いを理解していなかったので整理してみた

Posted at

はじめに

いままでclassとstructの違いをしっかり調べたことがなかったのでまとめてみました

違い1(初期化)

class

classはイニシャライザが必須です。
ないと怒られます

class PersonClass {
    var name: String
    
    init(name: String) {
        self.name = name
    }
}

スクリーンショット 2023-09-17 19.58.43.png

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) // たけし

mutatingないと怒られる
スクリーンショット 2023-09-17 20.22.02.png

おわり

ここら辺複雑でむずいです。
理解していないと予期せぬバグを生み出しそうなのでちゃんと勉強します。。。

足りないことや間違ってることがあればコメントで教えてくれると助かります

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
7