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

Objective-C で iOS アプリは書けるけど、Swift はどうなんだろ？って方も多いかと思います。 [先日アプリをリリース](https://itunes.apple.com/jp/app/id933246368?mt=8 "今日ヒマ？")したのですが、そのほとんどを Swift で書きました。言語仕様やツールが固まっていない中で色々苦労しましたが、その中で見つけた、Swift に移行するために最低限必要な事をまとめてみます。

この記事は [Swift Advent Calendar 2014](http://qiita.com/advent-calendar/2014/swift) 17日目の記事です。

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

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

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

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

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

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

__Objective-C, Objective-C++ のコードを Swift で使う__
http://qiita.com/mokumoku/items/a228d9f3db95b16fbae9

NSString / NSArray / NSDictionary なども使える
----

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

インスタンス
----

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

たとえば `NSString` であれば、

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

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

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

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

```swift
NSString.stringWith
```

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

```swift
NSString(
```

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

![Screen Shot 2014-12-15 at 22.28.55.png](https://qiita-image-store.s3.amazonaws.com/0/4617/d205ee21-6c3e-58b0-5ef7-415cd0be3bb2.png)


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

```swift
let str = String(format: "%lu items", items.count)
```
でも OK です。

Optional 型（! / ?）の扱い
----

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

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

__[Swift] Optional 型についてのまとめ Ver2__
http://qiita.com/cotrpepe/items/518c4476ca957a42f5f1

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

シングルトンとキー値監視（KVO）
----

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

### 定義

```swift
class YourClass : NSObject {

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

  func method() {
  }
  ...
```

### 使うとき

```swift
YourClass.sharedInstance.method()
```

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

__hpique/SwiftSingleton__
https://github.com/hpique/SwiftSingleton

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

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

```swift
  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 で開発したアプリは「[今日ヒマ？](https://itunes.apple.com/jp/app/id933246368?mt=8)」というアプリです。もし良かったらお試しくださいませ。