https://developer.apple.com/swift/ より
The Swift Programming Language (iBooks Store)をざっくり目を通してつらつらと。
継承
基本形:
class SomeClass : BaseClass {
// クラスの実装
}
:
に続けてベースクラスを指定する。Objective-C では NSObject
が基底クラス (ルートクラス) になる前提のようなものがありますが、Swift にはそのようなクラスはないようです。
サブクラスからベースクラス (スーパークラス) にアクセスするのは super
を利用します。
class SomeClass : BaseClass {
init() {
super.init()
// do something
}
}
init
はインスタンスの初期化時に呼ばれる特殊なメソッド。コンストラクタと言ってよいのかな。
オーバーライド
サブクラスではベースクラスのメソッドやプロパティを実装し直すことができ、オーバーライドと呼びます。
メソッドのオーバーライド
Objective-C ではオーバーライドするメソッドについて特に宣言などは必要ありませんが、Swift では Java のように override
と宣言する必要があります。
class BaseClass {
func doSomething() {
// なんかする
}
}
class SomeClass : BaseClass {
override func doSomething() {
super.doSomething()
// サブクラス側でなんかする
}
}
init
もメソッドだと思うのですが、override の宣言は必要ないようです。
プロパティのオーバーライド
プロパティも同様にオーバーライドできます。
class BaseClass {
var something : String
}
class SomeClass : BaseClass {
var something : String {
get {
return super.something
}
set {
let value = newValue ...... // do something ...
super.something = value
}
}
}
read-only のプロパティをオーバーライドして read-write なプロパティとして宣言するのは可能ですが、read-write なプロパティを read-only なプロパティとしてオーバーライドはできないようです。
willSet
や didSet
のオーバーライドも可能です。ただし、原理的に定数なプロパティや read-only なプロパティに対して、それらは動作しないとのこと。
添字アクセスのオーバーライド
サブスクリプトも同様にオーバーライドできます。
class BaseClass {
subscript(index: Int) {
get {
return ....
}
set(newValue) {
}
}
}
class SomeClass : BaseClass {
override subscript(index: Int) {
get {
return super[index]
}
set(newValue) {
super[index] = newValue
}
}
}
スーパークラスには super[index]
のような形でアクセスします。
@final
@final
アトリビュートを宣言することで該当メソッド・プロパティなどのオーバーライドを禁止することができます。
class BaseClass {
@final func doSomething() {
// なんかする
}
}
class SomeClass : BaseClass {
override func doSomething() { // コンパイルエラー !!!
}
}
クラス自体に @final
をつけることもでき、その場合には該当クラスを継承することができなくなるようです。