Learn Swift 第10章 クラス
このコーナーでは、Swift による、Mac OS X アプリケーションの作成方法を、説明しています。
クラス
クラスは、ある目的のための、定数(および変数)と関数を、一つにまとめたものです。
import Cocoa class ABC { let words:String = "Hello" func say() { print(words) } } let abc = ABC() abc.say()class ABCクラスは、キーワード class を使って定義します。class キーワードの後ろがクラス名です。クラス名は大文字で始めます。すべてを大文字にする必要はありませんが、ここでは ABC にしました。
クラスの内容は、必ず { と } の間に記述しなければなりません。
let abc = ABC()クラスは、定義しただけでは使えません。クラス名() を使って、クラスのインスタンス (instance、実体) というものを作って、初めて使えるようになります。ここでは、定数 abc に ABC クラスのインスタンスを設定しています。
abc.say()インスタンスの中の、定数(変数)や関数にアクセスするには、インスタンス.関数という具合に、. (dot、ドット) を使ってアクセスします。
なお、クラスの定数(変数)をプロパティ (property、属性) と呼び、クラスの関数をメソッド (method、方法) と呼びます。
プロパティ
次のリストのように、print(abc.words) と記述して、クラスの外から、直接、words プロパティにアクセスすることもできます。
import Cocoa class ABC { let words:String = "Hello" func say() { print(words) } } let abc = ABC() print(abc.words)words プロパティは let (定数) として定義していますので、値を変更することができません。words プロパティを、var (変数) に定義すると、クラスの外からも、words プロパティを変更することができるようになります。
import Cocoa class ABC { var words:String = "Hello" func say() { print(words) } } let abc = ABC() abc.words = "こんにちは" abc.say()let abc = ABC()ABC クラスのインスタンスを定数 abc に設定しています。
abc.words = "こんにちは"定数 abc に設定している、ABC クラスのインスタンスの、words プロパティに、新しい値である "こんにちは" を、設定しています。このことは、不思議に感じるかもしれません。定数の値は変更できないはずです。
let abc = ABC() というコードを実行して、定数 abc に設定されるのは、ABC クラスのインスタンスそのものではなく、インスタンスへの参照です。参照とは、そのインスタンスが存在する場所までの、道筋を記した、地図のようなものです。abc は定数ですので、この地図を変更することはできません。しかし、定数 abc で固定されているのは、その地図だけです。地図が指し示しているインスタンスの、words プロパティは、変更することができます。
この参照という概念は、プログラミングを始めた人の、誰もがつまずく概念です。焦らず、慣れていきましょう。
イニシャライザ
前節では、ABC() というコードで、ABC クラスのインスタンスを作成しました。この時に、ABC クラスの内部では、init() というメソッドが呼び出されています。init() メソッドは、特に記述しなくても、すべてのプロパティに初期値が設定されている場合は、自動的に作成される決まりになっています。しかしあえて、init() メソッドを記述することもできます。
import Cocoa class ABC { var words:String = "" init() { words = "Hi" } func say() { print(words) } } let abc = ABC() abc.say()var words:String = ""words プロパティの定義時には、"" で、空文字を設定しています。プログラミングでは、空文字は、空文字という値です。値が存在しないという意味ではありません。
words = "Hi"そして、init() メソッドの中で、words プロパティに、"Hi" という文字列を設定しています。結果として、デバッグエリアに「Hi」と表示されます。
init() メソッドには、引数がありませんが、引数のある init メソッドを定義することもできます。
import Cocoa class ABC { var words:String = "" init() { words = "Hi" } init(words:String) { self.words = words } func say() { print(words) } } let abc = ABC(words: "こんにちは") abc.say()このリストを実行すると、ABC クラスのインスタンスが作成される時に、init(words:String) メソッドが選ばれて、デバッグエリアには、「こんにちは」と表示されます。
self.words = wordsself キーワードは、そのクラス自身を表します。self.words とすることによって、この ABC クラスの words プロパティを指定しています。一方、"= words" の words は、この init メソッドの words 引数を表しています。
継承
あるクラスをもとにして、別の新しいクラスを作ることができます。このことを継承といいます。もとになったクラスをスーパークラス、もしくは親クラスと呼び、新しく作られたクラスをサブクラス、もしくは子クラスと呼びます。継承によって作られた新しいクラスは、特に何も記述しなくても、もとになったクラスの、すべてのプロパティとメソッドを持っています。そして、サブクラスには、新しいプロパティやメソッドを追加することができます。
import Cocoa class Super { var words:String = "Hello" func say() { print(words) } } class Sub: Super { } let sub = Sub() sub.words = "こんにちは" sub.say()このリストを実行すると、デバッグエリアに「こんにちは」と表示されます。
class Sub: Superクラス名の後に、: (colon、コロン) とスーパークラスを指定すると、そのスーパークラスの、すべてのプロパティとメソッドを引き継いだ、サブクラスが定義されます。
sub.words = "こんにちは"
sub.say()サブクラス Sub には、何も記述していませんが、words プロパティと say メソッドが、Sub クラスに存在することがわかります。
オーバライド
スーパークラスのメソッドを、サブクラスで、書き換えることができます。このことをオーバーライド (override) といいます。
import Cocoa class Super { var words:String = "Hello" func say() { print(words) } } class Sub: Super { override func say() { super.say() print("Bye") } } let sub = Sub() sub.say()このリストを実行すると、デバッグエリアに「Hello」、「Bye」と表示されます。
override func say()オーバライドするメソッドを定義する場合は、override キーワードで始めます。
super.say()super.メソッド名と記述することで、スーパークラスのメソッドを呼び出せます。サブクラスでメソッドをオーバーライドしても、スーパークラスのメソッドまでが書き換えられるわけではありません。
お疲れ様でした。
次章では、複数の値を管理する、コレクションという仕組みを、学習します。
無断転載禁止 Copyright 2016. vivacocoa.jp All right reserved.