スイスイSwift!第4回Swiftへの不安を解消しよう-導入編-
skill

スイスイSwift!第4回
Swiftへの不安を解消しよう-導入編-

2015.04.02

ent89_img01.jpg

昨年9月にリリースされたSwiftも早いもので半年が経とうとしている。いや、まだ半年と言うことに驚くべきだろうか。Swiftのコード共有やQAサイトへの投稿が爆発的に増えていることを考えると、とても生後半年の言語とは思えないだろう。その一方で従来までのObjective-Cでの経験が長い開発者の中にはコスト面や時間的な問題などで移行を尻込みしている方も多いのではないだろうか。
その移行についての不安を一問一答形式で2回の連載に分けて解説する。今回は導入編としてSwiftを書き始める前に気になりがちな質問を集めてみた。少しでもSwift化への手助けになればと思う。
繁田 卓二

■ UIKitやFoundationは使用できるのか?

従来までのUIViewやNSArrayなどiOS SDKに含まれるおなじみのUIKitやFoundationフレームワークは全てSwiftでも使用可能だ。Swiftで開発するにあたり、新しいパラダイムを憶える必要は無く、デリゲートやターゲット・アクションなどの手法も健在だ。これまで通りの感覚で開発が可能である。基本的にはObjective-Cで記述し動作しているプログラムコードはほぼ全てSwiftに書き換えることができる。次のコードではNSArrayとUIViewを両言語で比べてみた。

Objective-CでのNSArrayとUIViewの記述

// 配列の生成

NSArray *array = [[NSArray alloc] init];

// ソート

NSArray *newArray = [array sortedArrayUsingSelector:@selector(comare:)];

// ビューの作成

UIView *view = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 100, 100)];

[self addSubview:view];

SwiftでのNSArrayとUIViewの記述

// 配列の生成

let array = NSArray()

// ソート

let newArray = array.sortedArrayUsingSelector("compare:")

// ビューの作成

let view = UIView(frame: CGRectMake(0, 0, 100, 100))

self.view.addSubview(view)

基本文法さえ抑えておけば、あとは命名規則に従いメソッド名を変換するだけで動作する。

■ Objective-Cで書かれたサードパーティ製ライブラリや自作ライブラリは使用できるのか?

前述のNSArrayやUIViewはSwift向けにFoundationやUkitフレームワークが用意されているためSwiftから容易に使用が可能となっている。では自作のObjective-Cのコードやサードパーティ製のライブラリは利用できないのであろうか。答えはNOである。SwiftからObjective-Cのコード呼び出しは互換性があり基本的には使用可能である。

ただし、XcodeのプロジェクトテンプレートでSwiftを選択した場合はコンパイラにObjective-CとSwift変換させるために必要なブリッジングヘッダと呼ばれるファイルを追加する必要がある。XcodeからObjective-Cのファイルを追加しようとすると下図のようなダイアログが出て自動生成されるので、ここにimport宣言でライブラリをインポートしておけばSwiftファイルからどこでも使用可能だ。

図1.ブリッジングヘッダの追加警告

ent97_img02.jpg

ブリッジングヘッダファイルは最初の一度だけ追加すれば良い。

■ StoryboardやCoreDataエンティティエディターは使用できる?

基本的にはXcode内のGUIエディタ系はSwiftプロジェクトでも何も変わることは無い。StoryboardからViewControllerへのアウトレット接続も健在だ。またCoreDataエンティティエディタからモデルクラスの書き出しも従来通り使用可能である。

図2. ボタンとSwiftコードの接続

ent97_img03.jpg

■ CocoaPodsの対応は?

サードパーティ製のライブラリ管理にCocoaPodsという仕組みを使用していた方も多いだろう。Swiftでも利用できるように現在β版その機能が提供されている(原稿執筆時点2015年2月)。
β版は下記のgemコマンドでインストール可能だ。

$ sudo gem install cocoapods ?-pre

但し、既存のObjective-Cで書かれたライブラリを使用する際はプロジェクトに前述のブリッジングヘッダファイルに使用したいパッケージのヘッダファイルをインポートが必要だ。
例えばHTTP通信ライブラリで有名なAFNetworkingを使用する場合はブリッジングヘッダファイルで下記を記述すればよい。

#import <AFNetworking/AFNetworking.h>

これでSwiftからAFNetworkingが使用可能になる。

AFNetworkingによるHTTP通信処理

let manager = AFHTTPRequestOperationManager()

manager.responseSerializer = AFHTTPResponseSerializer()

manager.GET("http://localhost:8081",

 parameters:[],

 success: { (operation: AFHTTPRequestOperation!, responseObject: AnyObject!) -> Void in

  println("responseObject: \(responseObject)")

 },

 failure: { (operation: AFHTTPRequestOperation!, error: NSError!) -> Void in

  println("error: \(error)")

 }

)

■ Objective-CからSwiftのクラスが呼び出せるのか?

先ほどの逆。つまり、Objective-CプロジェクトでSwiftのファイルを追加しSwiftのクラスを呼び出せるのか、ということだが、答えはYESだ。ただしSwift固有の文法を使用した場合はObjective-Cからの呼び出し対象に入らない。公式サイトによると下記の文法が制限の対象となるようだ。

  • ? Generics(ジェネリクス)
  • ? Tuples(タプル)
  • ? Enumerations defined in Swift(列挙型)
  • ? Structures defined in Swift(構造体)
  • ? Top-level functions defined in Swift(トップレベルで宣言された関数)
  • ? Global variables defined in Swift(クラス外で宣言された変数)
  • ? Typealiases defined in Swift(タイプエイリアス)
  • ? Swift-style variadics(可変引数)
  • ? Nested types(クラス内で宣言されたクラスなどネストした型)
  • ? Curried functions(カリー化関数)

これらを一部でも使用したクラスはObjective-Cへインポートされないので気をつけよう。

■ ユニットテストは?

ユニットテストも従来通りXCTestフレームワークが使用可能だ。Swiftの記述になるだけであり何ら変わることは無い。もちろんObjective-Cのクラスをテストすることも可能だ。

SwiftでのXCTest

import XCTest

class SwiftTests: XCTestCase {

 override func setUp() {

  super.setUp()

  ~テスト前処理~

 }

 override func tearDown() {

  ~テスト後処理~

  super.tearDown()

 }

 func testVariables() {

  let a = ""

  let b = ""

  XCTAssertEqual(a, b)

  XCTAssertTrue(a == b)

  ~テストコード~

}

}

■ まとめ

今回は導入編として、Objective-C開発経験者が最初に気になる部分を挙げてみた。Swiftへの新規参入者だけでなくObjective-Cからの移行組を意識した互換性はAppleが重視したところであろう。実際はどれも大きな問題にはならずスムーズに移行できることがお分かり頂けたかと思う。

次回は実践編として実際にコードを書く際に不安となる部分の不安を払拭する。

原稿:繁田卓二
qnote最高技術責任者。猫とビールをこよなく愛するゆるキャラ系プログラマ。
Webアプリ開発からMacアプリ開発を経て現在はiOSアプリ開発に没頭。弱点はAndroid。

この記事はどうでしたか?

おすすめの記事

キャリアを考える

BACK TO TOP ∧

FOLLOW