NOTE Swift は、全てのクラスで共通する基本クラスを継承しません。スーパークラスを指定せずに定義したクラスは、自動的に基本クラスになります。
Vehicle
という基本クラスを定義しています。この基本クラスは、currentSpeed
と呼ばれる格納プロパティを定義します。デフォルト値は 0.0
です(プロパティの型は Double
と推論されます)。currentSpeed
プロパティの値は、description
と呼ばれる読み取り専用の String
型の計算プロパティに使用され、乗り物の説明をします。Vehicle
基本クラスは、makeNoise
と呼ばれるメソッドも定義します。このメソッドは、何もしませんが、後で Vehicle
のサブクラスによってカスタマイズされます。Vehicle
の新しいインスタンスを作成します。これは、型名とそれに続く空の括弧(()
)として記述されます。Vehicle
インスタンスを作成したら、その description
プロパティにアクセスして、乗り物の現在の速度の人間が読める形式の説明を出力します。Vehicle
クラスは、任意の乗り物に共通の特性を定義しますが、そのまま使用されることはあまりありません。より有用にするには、より具体的な種類の乗り物を記述する必要があります。:
)で区切ってスーパークラス名を記述します。Vehicle
のスーパークラスを持つ Bicycle
というサブクラスを定義しています。Bicycle
クラスは、currentSpeed
プロパティと description
プロパティ、makeNoise()
メソッドなど、Vehicle
の全ての特性を自動的に継承します。Bicycle
クラスは新しい格納プロパティ hasBasket
を定義し、デフォルト値は false
です(プロパティは Bool
型と推論されます)。Bicycle
インスタンスにはカゴがありません。特定の Bicycle
インスタンスが作成された後、そのインスタンスに対して hasBasket
プロパティを true
に設定できます。currentSpeed
プロパティを変更し、インスタンスで継承した description
プロパティにその変更を反映することもできます。Tandem
は Bicycle
から全てのプロパティとメソッドを継承し、Bicycle
は Vehicle
から全てのプロパティとメソッドを継承します。Tandem
サブクラスは、currentNumberOfPassengers
と呼ばれる新しい格納プロパティも追加します。デフォルト値は 0
です。Tandem
インスタンスを作成する場合、その新しいプロパティと継承したプロパティのいずれかを操作して、Vehicle
から継承した読み取り専用の description
プロパティの変更を反映できます。override
キーワードを付けます。そうすることで、間違った定義を継承していないことが明確になります。誤ってオーバーライドすると予期しない挙動が発生する可能性があり、override
キーワードを使用しないオーバーライドは、コンパイル時にエラーになります。override
キーワードを見て、オーバーライドするクラスのスーパークラス(またはその親の 1 つ)に、指定した宣言と一致する宣言があることを確認します。このチェックにより、オーバーライドする定義が正しいことが確認されます。super
プレフィックスを使用して、メソッド、プロパティ、または subscript のスーパークラスバージョンにアクセスします:someMethod()
という名前のオーバーライドされたメソッドは、オーバーライドしたメソッドの実装内で super.someMethod()
を呼び出すことにより、someMethod()
のスーパークラスのバージョンを呼び出すことができますsomeProperty
と呼ばれるオーバーライドされたプロパティは、オーバーライドした get または set 実装内で super.someProperty
として someProperty
のスーパークラスのバージョンにアクセスできますsomeIndex
に対する subscript は、オーバーライドした subscript 実装内から、super[someIndex]
で同じ someIndex
に対する subscript のスーパークラスのバージョンにアクセスできますTrain
と呼ばれる Vehicle
の新しいサブクラスを定義します。これは、Train
が Vehicle
から継承した makeNoise()
メソッドをオーバーライドしています。Train
の新しいインスタンスを作成し、その makeNoise()
メソッドを呼び出すと、Train
サブクラスのバージョンのメソッドが呼び出されていることがわかります。NOTE プロパティのオーバーライドの一部として set を提供する場合は、get も提供する必要があります。オーバーライドした get 内で継承した値を変更したくない場合は、get からsuper.someProperty
を返すことで、継承した値を渡すことができます。someProperty
は、オーバーライドするプロパティの名前です。
Vehicle
のサブクラスの Car
という新しいクラスを定義します。Car
クラスは、デフォルトの整数値 1
で、gear
と呼ばれる新しい格納プロパティを導入します。Car
クラスは、Vehicle
から継承する description
プロパティもオーバーライドして、現在のギアを含むカスタムの説明を提供します:description
プロパティのオーバーライドは、Vehicle
クラスの description
プロパティを返す super.description
を呼び出すことから始まります。次に、Car
クラスの description
は、現在のギアに関する情報を提供するために、この説明の最後にいくつかのテキストを追加しています。Car
クラスのインスタンスを作成し、その gear
プロパティと currentSpeed
プロパティを設定すると、description
プロパティが Car
クラス内で定義されたカスタマイズされた説明を返します。NOTE 継承した定数の格納プロパティまたは継承した読み取り専用計算プロパティにプロパティオブザーバを追加することはできません。これらのプロパティの値は変更できないため、オーバーライドの一部としてwillSet
またはdidSet
の実装を提供することは適切ではありません。 同じプロパティに対して、set のオーバーライドとプロパティオブザーバのオーバーライドの、両方を提供することはできないことにも注意してください。プロパティの値の変更を監視する必要があり、そのプロパティのカスタムの set を既に提供している場合は、カスタムの set 内から値の変更が簡単に監視できます。
Car
のサブクラスの AutomaticCar
という新しいクラスを定義しています。AutomaticCar
クラスは、現在の速度に基づいて使用する適切なギアを自動的に選択する自動ギアボックスを備えた車を表します:AutomaticCar
インスタンスの currentSpeed
プロパティを設定するたびに、プロパティの didSet
オブザーバは、インスタンスの gear
プロパティに新しい速度に適したギアを選択します。具体的には、プロパティオブザーバは、新しい currentSpeed
値を 10
で除算し、最も近い整数に切り捨てられた値に 1
を加えたギアを選択します。速度 35.0
はギア 4
を生成します。final
修飾子を記述します(final var
、final func
、final class func
や final subscript
など)。final
メソッド、プロパティ、または subscript をオーバーライドしようとすると、コンパイルエラーになります。extension でクラスに追加するメソッド、プロパティ、または subscript にも、final
をマークすることができます。class
キーワードの前に final
修飾子を記述することで、クラス全体を final
としてマークできます(final class
)。final
クラスをサブクラス化しようとすると、コンパイルエラーになります。