Objective-C
iOS
Swift
SwiftDay 18

Objective-C に慣れてきた人が Swift に移行するために最低限必要な事

More than 3 years have passed since last update.

Objective-C で iOS アプリは書けるけど、Swift はどうなんだろ?って方も多いかと思います。 先日アプリをリリースしたのですが、そのほとんどを Swift で書きました。言語仕様やツールが固まっていない中で色々苦労しましたが、その中で見つけた、Swift に移行するために最低限必要な事をまとめてみます。

この記事は Swift Advent Calendar 2014 17日目の記事です。


Swift の新しい機能は使わなくてもよい

Swift は新しい言語であり、タプルやジェネリックといった様々なモダンな仕組みが導入されていますが、それらを使わなくても iOS アプリを開発することは可能です。

もちろん、それらを使ったたほうが効率よく開発できたり、パフォーマンスの面でも有利なこともありますが、まずは、Swift でアプリを作ることに慣れて、その後に新しい仕組みを導入していくので良いと思います。


既存の Objective-C のライブラリ/ソースコードを利用する

アプリ開発においてはライブラリを活用することが不可欠ですが、Swift で書かれたものはまだあまりない状況です。しかし、Swift から Objective-C を呼び出すことができるのでほぼ問題ありません。実際、開発したアプリは途中まで Objective-C で書いていて、その一部は Swift で書き直すことなく呼び出して利用しています。もちろん、CocoaPods を使ってライブラリをインストールすることも可能です。

Objective-C のライブラリやコードを利用するためには、Bridging Header というファイルが必要です。その設定方法がちょうど 10日の Advend Calendar で書かれていましたので、こちらをご参照ください。

Objective-C, Objective-C++ のコードを Swift で使う

http://qiita.com/mokumoku/items/a228d9f3db95b16fbae9


NSString / NSArray / NSDictionary なども使える

Swift では、言語レベルで文字列や配列、辞書(連想配列)をサポートしていますが、NSArrayNSDictionary といった、既存のクラスも使うことができます(もちろんそれらの Mutable も)。今はあまり使うこともないですが、開発当初はよく使っていました。


インスタンス

最初の頃ハマったのが、インスタンスでした。

たとえば NSString であれば、

// obj-c

NSString *str = [[NSString alloc] initWithFormat:@"%lu items", items.count];
// or
NSString *str = [NSString stringWithFormat:@"%lu items", items.count];

のような感じでインスタンスしますが、Swift だと、

// swift

let str = NSString(format: "%lu items", items.count)

という感じになります。思わず、

NSString.stringWith

と入力して、Xcode が補完してくれるのを待ってしまいがちですが、

NSString(

と入力してから補完の候補を選びましょう。こんな感じで候補が出てきます。

Screen Shot 2014-12-15 at 22.28.55.png

ちなみに、例として NSString を使いましたが、文字列なので Swift の String

let str = String(format: "%lu items", items.count)

でも OK です。


Optional 型(! / ?)の扱い

Swift の特徴の1つである Optional 型、 nil を許容しない変数というのはかなり画期的なのですが、当初はかなり混乱しました。しかも、SDK のバージョンを上げるたびに言語仕様が変わり、毎回「!」を付けたり取ったりする感じでなかなかルールを理解できませんでした。

そのため、多くの方がこの Qiita でもわりやすい解説を書いてくれています。僕が解りやすいと思ったのはこの記事です。

[Swift] Optional 型についてのまとめ Ver2

http://qiita.com/cotrpepe/items/518c4476ca957a42f5f1

最近だと Xcode が適切な Warning を出してくれるので、それに従って修正することが多いです。


シングルトンとキー値監視(KVO)

前述の通り、Swift 独自の機能はあまり使わなかったのですが、シングルトンを実現するために下記のようなコードを書きました。


定義

class YourClass : NSObject {

// for Singleton
class var sharedInstance: YourClass {
struct Singleton {
static let instance : YourClass = YourClass()
}
return Singleton.instance
}

func method() {
}
...


使うとき

YourClass.sharedInstance.method()

もちろん自分で考えたわけではなく、下記の GitHub のサンプルを参考にしました。

hpique/SwiftSingleton

https://github.com/hpique/SwiftSingleton

シングルトンにして、キー値監視(KVO)を行ってビュー間で連携を行ったのですが、KVO は NSObjectaddObserver()observeValueForKeyPath() を利用しました(なので、NSObject を継承している)。Swift でもその仕組みはあるみたいですが、使い慣れたものを使いました。

この時、監視するプロパティには dynamic をつける必要があります。

  dynamic var flag = false


Playground で Swift を試してみる

Swift を知るためには、実際にコードを書いて振る舞いを試すのが一番早いのですが、Playground を使うとリアルタイムに実行して結果を表示してくれるので非常に便利です。使い方や活用方法はこのブログ記事が詳しかったです。

[Swift]グラフもレンダリングもイケる!Playgroundが超絶便利!

http://www.dorapro.co.jp/engineerblog/?p=137


まとめ

新しい言語を覚えるのも簡単ではないですが、Objective-C でアプリを開発できる方であれば、Swift への移行は意外と楽にできるのではないかと思います(よっぽど Auto Layout とかの方がが難しいし)。まずは、既存のコードを Swift に置き換えてみるところから始めてみてはいかがでしょうか?

Swift のリリース当初は言語仕様も固まっておらず、Xcode のバグもあって非常に苦労して開発したのですが、最近だと言語も Xcode も安定していて、ストレスなく開発ができるようなってきました。また、Qiita にも様々な紹介記事が載っていますし、情報も以前よりも増えていると思います。

現時点で積極的に Swift に移行する理由もないのですが、Apple のことなので、いつ Objective-C のサポートを打ち切るかもわかりません。その前に、ちょっとずつ準備を始めるのもいいかもしれません。個人的には、Swift は書いていて気持ちいい言語だと思うので、この記事が Swift を始めるきっかけになれば幸いです。

ちなみに、今回 Swift で開発したアプリは「今日ヒマ?」というアプリです。もし良かったらお試しくださいませ。