メソッド
ここではプログラミング言語 Swift で、クラスや構造体を定義するときに、メソッドを定義する方法を説明します。
オブジェクト指向言語でクラスを定義するときに、属性や動作を定義する方法は非常に重要です。
属性については、「プロパティ」で説明しています。
ここではオブジェクトの「動作」を指定するメソッドをみてみましょう。
インスタンスメソッドとタイプメソッド
クラスはあるオブジェクトのテンプレートとなります。個々の実体は「オブジェクト」とか「インスタンス」といいます。
あるオブジェクトのメソッドは、インスタンスメソッド (instance methods) といいます。
クラス内の定義で、特に修飾子無しで記述した関数はインスタンスメソッドになります。
class Car {
var tire = 4
init( tire : Int ){
self.tire = tire
}
func run() {
print( "run - tire \(self.tire)" )
}
}
var c = Car( tire : 4 )
c.run()
実行結果
run - tire 4
インスタンスメソッドでは自分のインスタンスは self. として参照できます。
上の例では run メソッドで tire というストアドプロパティを参照するために self.tire としています。 しかしながら、通常は self. は不要で tire だけで参照できます。
メソッドのパラメータリストに同じ名前のパラメータがある場合には、ストアドプロパティとメソッドのパラメータを区別するために self. をつける必要があります。
例えば、上記の例ではイニシャライザ init のパラメータの名前である tire が、ストアドプロパティの tire と同じなので、 ストアドプロパティの方の tire を参照するために self.tire とします。
mutating メソッド
インスタンスメソッドではそのクラスのプロパティに参照することが可能です。
しかしながら、struct や enum などの Value Type のオブジェクトでは、デフォルトでインスタンスメソッドからプロパティの値を変えることはできません。
Value Type のオブジェクトでメソッドからプロパティを変更する場合は、メソッドに mutating を指定します。
struct Car {
var tire = 4
init( tire : Int ){
self.tire = tire
}
mutating func updateTire( tire : Int ) {
self.tire = tire
}
}
var c = Car( tire : 4 )
print( "c.tire = \(c.tire)" )
c.updateTire( tire: 2 )
print( "c.tire = \(c.tire)" )
タイプメソッド
struct や class にて、static 修飾子をつけて記述したメソッドは、タイプメソッド (type methods) といいます。
struct Car {
static func foo(){
print( "== Car.foo() ==" )
}
}
Car.foo()
他の Java や C# などのプログラミング言語をご存知の方は、static メソッドの概念は良くご存知と思います。 インスタンスを作らないで利用できるメソッドです。
Swift では static という修飾子をメソッドにつけるとタイプメソッドになります。