インスタンスメソッドとは
型のインスタンスに紐づいたメソッド
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
参考文献