Objective-CとSwiftを使ってみよう – クラスを定義する(Swift編)

Objective-CとSwiftを使ってみよう – クラスを定義する(Objective-C編)ではObjective-Cにおけるクラスの定義の仕方を説明した。今回はSwiftにおける定義の仕方について簡単に説明を行いたい。

クラスの定義のしかた

SwiftではObjective-Cとは違い、ソースコードのファイルは宣言部と実装部に分かれておらず、基本的には1クラス1 ファイルとなるような構造がベースとなっている。

たとえば、サンプルとしては以下の様な形となる。

サンプルコード

Hello.swift

import Foundation

class Hello {
    var foo = 0

    let bar = 1

    func sayHello() {
        print("hello,world")
    }

    var baz: Int { return 2 }
}

プロパティーを定義する

プロパティーを定義する場合は、クラス内に変数を定義することでプロパティーとして扱われる。また、プロパティーを定義する場合に追加のコードを入れることで、getterやsetterなどの処理を実装することもできる。

プロパティーの例

一般的なプロパティー

var foo = 1

上記の場合はfooの名のインスタンスプロパティーが定義され、値の書き換えも可能である。

読み取り専用のプロパティー

let foo = 1

こちらは書き換えできない読み取り専用のプロパティーである。

getter/setterを独自に定義する場合

var _bar = 0
var bar: Int {
    get { return _bar }
    set { _bar = newValue }
}

上記の場合はgetter/setterを独自に定義した場合のプロパティーである。この場合は何かしらの理由で処理を行うときに利用可能である。また、setterに関連したものでは、setの前に呼ばれるwillSetと、setの後に呼ばれるdidSetも利用できる。

var baz {
    willSet {
        // setの前に呼ばれる処理
    }
    didSet {
        // setの後に呼ばれる処理
    }
}

メソッドの定義のしかた

メソッドは以下の様に定義する。

引数・返値のない場合

func sayHello() {
    print("hello,world")
}

引数・返値のある場合

func foo(bar: Int, baz: Int) -> Int {
    return bar + baz
}

メソッド・プロパティーの修飾子の例

アクセス修飾子

修飾子名修飾子の意味
privateプライベートメソッドまたはプロパティー。同じクラス自身からのみアクセス/継承可能。
fileprivateファイル単位のプライベートメソッドまたはプロパティー。同じファイルからのみアクセス/継承可能。
internalデフォルトはこのアクセス修飾子になる。同じパッケージからのアクセス/継承可能。
publicinternalに加えて、外部パッケージからのアクセスが可能になるが、継承は不可能。このアクセス修飾子はアプリの開発で使うことはないが、フレームワークの開発で使われる。
openpublicに加えて、外部パッケージからも継承が可能になる。フレームワークの開発で使われる。

プロパティーのアクセス修飾子はgetter/setterごとに指定することもかのうで、例えば、private(set) var foo: Intの場合はgetterはinternal、setterはprivateになり、外部クラスからは値を取得することはできるが書き換えることはできないようになる。

その他の修飾子

修飾子名修飾子の意味
classクラスプロパティーあるいはクラスメソッドを意味する。この修飾子を付与された場合はインスタンス間で共有される。
static静的プロパティーあるいは静的メソッド。この修飾子を付与された場合はインスタンス間で共有される。staticとclassでは内部的に差異があり、同一の修飾子として扱うことはできない。
weakプロパティーのみ。弱い参照をあらわし、循環参照を防ぐことができる。
lazyプロパティーのみ。インスタンス生成後、はじめて呼ばれたときに値の代入が行われるプロパティー。

最後に

今回はSwiftのクラスの定義、及びそれに付随する変数、プロパティー、メソッドの定義について説明を行った。SwiftではObjective-Cからかなり言語仕様の変更が行われおり、Objective-Cでは実現されていなかった言語仕様が補完され、全体的には一般的なオブジェクト指向プログラミング言語に近いレベルになっている。インターフェース周りでSwiftとObjective-Cは連携できるように工夫されているものの、言語仕様の差異はかなり大きいため、SwiftとObjective-Cを併用してプログラムを作る場合、このことを意識して開発を行う必要があるといえる。

タイトルとURLをコピーしました