LoginSignup
0
2

インスタンスメソッド・スタティックメソッド・値型のmutatingキーワードを理解しよう!

Posted at

インスタンスメソッドとは

型のインスタンスに紐づいたメソッド
funcキーワードで定義したメソッドは、デフォルトではインスタンスメソッドである。
インスタンスを生成し、プロパティに値を保持させたい時。

Playgroundで見てみましょう!

struct Counter {
    var count = 0
    func printCount() {
        print("\(self.count)")
    }
}

var counter1 = Counter()
counter1.count = 1
counter1.printCount()

var counter2 = Counter()
counter2.count = 2
counter2.printCount()

実行結果それぞれのインスタンスを生成し、インスタンスごとに応じた値が出力される。
出力結果

1
2

スタティックメソッドとは

型自身に紐づくメソッドであり、インスタンスに依存しない処理に使用する!
プロパティに値を保持させる必要なく、型に紐づけたい時。

struct Counter {
    static var count = 0
    static func changeCount(changeNumber: Int) {
        Self.count = changeNumber
        print("\(Self.count)")
    }
}

print("\(Counter.count)")
Counter.changeCount(changeNumber: 5)

型自身に紐づくメソッドであるため、インスタンス化せず、型名.メソッドで、Counter.changeCount(changeNumber: 5)で呼び出せる!
出力結果

0
5

値型のmutatingキーワードとは

値型では、mutatingキーワードをメソッドの宣言に追加することで、自身の値を変更する処理を実行できる!
メソッドを実行してインスタンスの値を変更すると、変数へ暗黙的な再代入が行われる!

struct Counter {
    var count = 0
    mutating func addcount() {
        self.count += 1
    }
}
//letで宣言するとコンパイルエラー
var counter1 = Counter()
print("\(counter1.count)")
counter1.addcount()//countに再代入
counter1.addcount()//countに再代入
counter1.addcount()//countに再代入
print("\(counter1.count)")

出力結果

0
3

構造体は直接ストアドプロパティを変更できないが、mutatingを使用することで、プロパティに再代入可能になる!
var counter1 = Counter()はletではエラーになる!
counter1.addcount()が呼ばれ、counter1に再代入が行われ、インスタンスが保持する値が変更されるため。
counter1インスタンスを再代入の都度、新しい実体を生成しているイメージ。

classはmutatingキーワード不要

class Counter {
    var count = 0
    func addcount() {
        self.count += 1
    }
}
//letで宣言できる!
let counter2 = Counter()
print("\(counter2.count)")
counter2.addcount()
counter2.addcount()
counter2.addcount()
print("\(counter2.count)")

mutatingを使用しなくても、classはプロパティに再代入できる!
classがletで宣言できるのは、参照型で、インスタンスの値が共有できるからだと考えられます!
値が共有できるため、counter2の実体のプロパティの変更が自動更新されるイメージ。

出力結果

0
3

参考文献

0
2
0

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
  3. You can use dark theme
What you can do with signing up
0
2