Learn Swift / viva Cocoa


Learn Swift 第10章  クラス


このコーナーでは、Swift による、Mac OS X アプリケーションの作成方法を、説明しています。

2016年1月19日

home  目次  前へ  次へ  mail


クラス

 クラスは、ある目的のための、定数(および変数)と関数を、一つにまとめたものです。

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 = words

 self キーワードは、そのクラス自身を表します。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.メソッド名と記述することで、スーパークラスのメソッドを呼び出せます。サブクラスでメソッドをオーバーライドしても、スーパークラスのメソッドまでが書き換えられるわけではありません。


お疲れ様でした。

 次章では、複数の値を管理する、コレクションという仕組みを、学習します。


home  目次  前へ  次へ  mail


無断転載禁止
Copyright 2016. vivacocoa.jp All right reserved.