Swift言語の入門 (2) 列挙型編やSwift言語の入門 (5) 構造体編などで説明したとおり、これら二つの要素もクラスに引けを取らない機能を備えており、かつクラスとは全く異なる特徴を兼ね備えています。
この章ではこれらの違いも確認しながら、クラスの定義から利用方法までをひととおりみていきます。
1.宣言
もっとも小さいクラスの宣言は、以下の通りです。
class Player{
}
プロパティや関数を宣言するには、中括弧の中にかきます。
struct Point {
var x:Double
var y:Double
}
class Player{
var position:Point = Point(x:0, y:0);
func moveTo(p:Point){
position = p;
}
}
ここではpositionに初期値を設定してありますが、設定しないとコンパイルエラーになります。その理由は、現状Playerクラスはイニシャライザ(コンストラクタに相当)を持っていないためpositionが初期化されず、またpositionの型はPoint型でnilを受け付けないからです。なので、Point型の最後に「?」や「!」をつけてオプションにするか、イニシャライザの中でpositionを初期化すればコンパイルエラーは起きなくなります。
2.インスタンスの生成
クラスのインスタンスを生成するには、ただ単にクラス名の後に「()」をつけ、引数を記述します。それぞれの引数には変数名をつける必要があります。
var player = Player(position:Point(x:1, y:2))
これらの変数名は、外部変数名と呼ばれ、通常イニシャライザの内部処理を記述するときにそのまま内部変数名として使われますが、以下のように書くことで、外部変数名と内部変数名を別の文字列にすることが可能です。
init(position p:Point){
self.position = p
}
3.関数の呼び出し
クラスのインスタンスの持つ関数を呼び出すには、構造体や列挙型とおなじく、「.」のあとに関数名を書きます。
player.moveTo(Point(x:100, y:-100))
4. クラスの継承
クラスを継承して新たなクラスを作成するには、以下のようにクラス名の後に「:」を書き、その後に親クラスの名前を書きます。継承はクラスのみに許されている機能で、他のクラスの機能を受け継ぎながら、新たな機能を追加し再利用するための機構です。
class RoboPlayer : Player{
init(){
super.init(position:Point(x:6, y:0))
}
override func moveTo(p:Point){
//ロボはたまに言うことをきかない、とか
}
}
子クラスのイニシャライザでは、親クラスのイニシャライザを呼び出す必要があります。
5.デイニシャライザ(Deinitializer)
クラスのインスタンスが解放されるときには、デイニシャライザと呼ばれる特別な関数が実行されます。デイニシャライザは引数をとらず、書き方は以下の通りです。
class DeinitialzerTest{
deinit{
}
}
総括
- クラスの関数はいつでも内部変数を書き換えられる
- クラスは別のクラスを継承できる
- デイニシャライザはクラスだけの機能
0 件のコメント:
コメントを投稿