スマートデバイスアプリ開発のあれやこれや

楽なところから始めるObjective-CからSwiftへの移行

少し前から進めていたSwiftのお勉強の成果として
Objective-CからSwiftに移行するときのポイントをまとめてみます。


自分自身、そこまで習熟者ではないので
コンセプトとしては”楽なところ”から移行というテーマで
書いてみたいと思います。

Optionalでnilチェックを駆逐する

Swiftを始めて一番便利だと感じたのがOptional型です。
というか、非Optionalな変数がnilを拒絶する点が素晴らしい。

// 非Optional型の変数を定義します
var moji = "もじもじ君"
moji = nil // コンパイルエラー発生


こんな感じでXcodeがエラー扱いにしてくれます。

この特性がどこで発揮されるか!?といえば
その1つがメソッドの引数に関するnilチェック処理だと思います。
Objective-Cだと↓みたいなコードよく書きませんか?

- (NSString *)myMethod:(NSString *)arg  {
    // nilチェック
    if (arg != nil) {
        return nil;
    }
}


ただただ面倒くさい!
とはいえ、チェックがないと怖すぎる……。
Swiftの変数はデフォルトでnilを許容しないので
非Optionalで引数定義するだけでチェック処理が駆逐出来ます。

func myMethod(#arg:String) -> String {
    // さらばnilチェック
}

Genericsで型チェックを厳密に!

Genricsも意図しない型が代入されるリスクをなくせる点でメリットが大きいです。
クラス定義や関数定義でGenericsを活用する......という旨味もあるのですが
”楽なところ”からがコンセプトなので省略です。


じゃあ,どこで使うかといえば,配列とDictonaryです。
Objective-Cでは,配列やDictonaryに投入出来る変数型はid型なので
『この配列にはNSStringしか入れたくない!』ということを実現しようとすると
下のようなコードを書いて抑止するしかないです。

// 引数がNSStringクラスだったら
if ([args isKindOfClass:[NSString class]]) {
    [list addObject: args];
}


面倒です。とても面倒です。
Swiftでは定義するときに投入する型を指定します。

let list:Array<String> = Array<String>()


こんな感じで配列の中身はStringだよ!と指定してあげます。
上を書くのが面倒であれば下のような書き方でもOKです。

let list = [String]()


ちなみにディクショナリだと下のような感じです。

let map:Dictionary<String:MyClass> = Dictonary<String:MyClass>()


ひとまず、OptionalとGenericsの2点から始めると良いと思います。
今回のエントリには書いてませんが,.hファイルと.mファイルが
.swiftファイルにまとまるので,それだけでも楽になる気がします。