{
)と閉じ括弧(}
)内に記述します。インスタンスメソッドは、その型の他の全てのインスタンスメソッドおよびプロパティに暗黙的にアクセスできます。インスタンスメソッドは、それが属する型の特定のインスタンスでのみ呼び出すことができます。既存のインスタンスがなければ、単独で呼び出すことはできません。Counter
クラスを定義する例を次に示します:Counter
クラスは 3 つのインスタンスメソッドを定義します。increment()
は、カウンタを 1 ずつインクリメントしますincrement(by: Int)
は、指定された整数分だけカウンタをインクリメントしますreset()
は、カウンタを 0 にリセットしますCounter
クラスは、現在のカウンタ値を追跡するために変数プロパティ count
も宣言していますself
と呼ばれる暗黙のプロパティがあります。自身のインスタンスメソッド内で現在のインスタンスを参照するには、self
プロパティを使用します。increment()
メソッドは、次のように記述できます:self
を頻繁に記述する必要はありません。self
を明示的に記述しない場合、メソッド内のプロパティまたはメソッド名を使用するとき、Swift は常に現在のインスタンスのプロパティまたはメソッドを参照していると見なします。この想定は、Counter
の 3 つのインスタンスメソッド内で(self.count
ではなく)count
を使用していることからもわかります。self
プロパティを使用します。self
は、x
と呼ばれるメソッドパラメータと x
と呼ばれるインスタンスプロパティとの間のあいまいさを解消します:self
プレフィックスがない場合、Swift は両方の x
をメソッドパラメータを参照していると見なします。self
プロパティに割り当てることもでき、メソッドが終了すると、既存のインスタンスはこの新しいインスタンスに置き換えられます。func
キーワードの前に mutating
キーワードを配置します:Point
構造体は、自身に変更を加える moveBy(x:y:)
メソッドを定義します。これは、Point
インスタンスを一定量移動します。新しいポイントを返す代わりに、呼び出されたポイントを実際に変更します。プロパティを変更できるようにするために、mutating
キーワードがその定義に追加されてます。self
プロパティに割り当てることができます。上記の Point
の例は、代わりに次のように記述できます:mutating
moveBy(x:y:)
メソッドは、x
と y
がターゲットの位置に設定された新しい構造体を作成します。この代替バージョンのメソッドを呼び出した場合の最終結果は、先ほどのバージョンを呼び出した場合とまったく同じになります。self
パラメータを同じ列挙型とは異なるケースに設定できます。next()
メソッドが呼び出されるたびに、3 つの異なる電源状態(off
、low
と high
)を切り替えます。func
キーワードの前に static
キーワードを記述して、型メソッドを示します。クラスは代わりに class
キーワードを使用して、サブクラスがそのメソッドのスーパークラスの実装をオーバーライドできるようにすることができます。NOTE Objective-C では、クラスに対してのみ型レベルのメソッドを定義できます。Swift では、全てのクラス、構造体、および列挙型に対して型レベルのメソッドを定義できます。各型メソッドは、サポートする型に明示的にスコープされます。
SomeClass
というクラスで型メソッドを呼び出す方法は次のとおりです:self
プロパティは、その型のインスタンスではなく、型自体を参照します。これは、インスタンスプロパティとインスタンスメソッドパラメータの場合と同様に、self
を使用して、型プロパティと型メソッドパラメータのあいまいさを解消できることを意味します。LevelTracker
と呼ばれる構造体を定義しています。シングルプレイヤー用のゲームですが、1 つのデバイスに複数のプレイヤーの情報を保存できます。LevelTracker
構造体は、型プロパティとメソッドを使用して、ゲームのどのレベルが解放されたのかを追跡します。また、個々のプレーヤーの現在のレベルも追跡します。LevelTracker
構造体は、任意のプレーヤーが解放した最高レベルを追跡します。この値は、highestUnlockedLevel
という型プロパティに格納されます。LevelTracker
は、highestUnlockedLevel
プロパティを操作する 2 つの型メソッドも定義します。1 つ目は、unlock(_:)
と呼ばれる型メソッドで、新しいレベルが解放されるたびに最高の highestUnlockedLevel
の値を更新します。2 つ目は、isUnlocked(_ :)
と呼ばれる便利な型メソッドで、特定のレベル番号がすでに解放されている場合に true
を返します。(これらの型メソッドは、LevelTracker.highestUnlockedLevel
として記述しなくても、highestUnlockedLevel
型プロパティにアクセスできることに注目してください)LevelTracker
は、ゲーム全体での個々のプレーヤーの進行状況を追跡します。これは、currentLevel
というインスタンスプロパティを使用して、プレーヤーが現在再生しているレベルを追跡します。currentLevel
プロパティの管理を容易にするために、LevelTracker
は advance(to:)
というインスタンスメソッドを定義します。currentLevel
を更新する前に、このメソッドは、要求された新しいレベルが既に解放されているかどうかを確認します。advance(to:)
メソッドは、currentLevel
を実際に設定できたかどうかを示すブール値を返します。advance(to:)
の戻り値を無視することもあるため、このメソッドは @discardableResult
属性でマークされています。この属性の詳細については、Attributes(属性)を参照ください。LevelTracker
構造体は、下記に示す Player
クラスで使用され、個々のプレーヤーの進行状況を追跡および更新します:Player
クラスは、LevelTracker
の新しいインスタンスを作成して、そのプレーヤーの進行状況を追跡します。また、complete(level:)
というメソッドも提供します。これは、プレーヤーが特定のレベルをクリアするたびに呼び出されます。このメソッドは、全てのプレーヤーの次のレベルを解放し、プレーヤーの進行状況を更新して次のレベルに移動します。(レベルは前の行の LevelTracker.unlock(_:)
の呼び出しによって解放されていることがわかっているため、advance(to:)
のブール値の戻り値は無視されています)Player
クラスのインスタンスを作成し、プレーヤーがレベル 1 をクリアしたときに何が起こるかを確認できます。