Swift移行時に引っかかりそうなことを解決する!

第3回 XcodeプロジェクトのSwiftへの移行とObjective-Cコードの参照

この記事を読むのに必要な時間:およそ 3 分

はじめに

前回はSwift言語について解説しました。今回からは,実際にiOSアプリを開発していくために必要なことについて解説して行きます。

第3回の今回は,既存のObjective-CのプロジェクトをSwiftに移行したり,Objective-Cのライブラリを活用する方法を解説します。また,CocoaPodsをSwiftで活用する方法もご紹介します。

新しくSwiftのプロジェクトを作成する場合

新しくプロジェクト作る場合は,Product Nameなどを入力するダイアログの「Language」「Swift」にします。それ以外はObjective-Cの場合と同じです。

図1 ⁠Language」「Swift」にする

図1 「Language」を「Swift」にする

ファイル構成を見て見ましょう。

図2 ファイル構成

図2 ファイル構成

おなじみのAppDelegateやViewControllerがありますが,拡張子が「.swift」になっています。これがSwiftを記述するファイルです。あと,ヘッダファイル(.h)はありません。なにげにこれがすごく嬉しかったりします。

あとはObjective-Cの場合と同じで,ビルド(Run)すればiOSシミュレータが起動して,アプリが表示されます。

既存のObjective-CプロジェクトをSwiftに移行させる場合

すでにObjective-Cで開発を進めている方は,途中からSwiftに切り替えたいケースもあるかと思います。この場合,すべてのコードをSwiftに書き換える必要はなく,既存のObjective-Cコードを残したまま,Swiftのコードを追加していくことが可能です。

その手順を実際の例で見ていきましょう(下記の例では,XcodeでiOSのSingle View ApplicationのプロジェクトをObjective-Cで新規作成したところから始めています)⁠

プロジェクトを開いた状態で,メニューの[File][New][File...]を選びます。表示されるダイアログの左側メニューで[iOS][Source]⁠ を選んで,⁠Cocoa Touch Class」を選択します(⁠Swift File」は選びません)⁠

図3 ⁠Cocoa Touch Class」を選択

図3 「Cocoa Touch Class」を選択

次に表示されるダイアログで,クラス名と親クラスを指定します。ここでは,図のようにクラス名を「NewViewController」⁠親クラス(Subclass of:)「UIViewController」としました。言語は「Swift」を選択します。

図4 クラス名を「NewViewController」⁠親クラスを「UIViewController」とした

図4 クラス名を「NewViewController」,親クラスを「UIViewController」とした

ファイルを保存すると,下記のダイアログが表示されます。

図5 ダイアログが表示される

図5 ダイアログが表示される

「Would you like to configure an Objective-C bridging header?」というダイアログですが,⁠Yes」を選択します。すると2つのファイルが追加されました。

図6 2つのファイルが追加された

図6 2つのファイルが追加された

1つは先ほど追加したSwiftファイル,もう1つは「ExampleObjC-Bridging-Header.h」という名前のファイルで,これが「Objective-C bridging header」です。

SwiftからObjective-Cのクラスにアクセスするためには,アクセスしたいObjective-CのヘッダファイルをこのObjective-C bridging headerでインポートする必要があります。その準備をXcodeが行ってくれたのです。

では例として,NewViewControllerからViewControllerクラスにアクセスできるようにしてみましょう。

NewViewController.swiftを開きます。すると,下記のようなクラスの宣言が見つかると思います。

// NewViewController.swift 
class NewViewController: UIViewController {
    ……

これは,UIViewControllerを継承した,NewViewControllerというクラスの宣言です。ではこの親クラス(UIViewController)を,ViewControllerに変更して,ビルドしてみます。

図7 親クラスをViewControllerに変更してビルド

図7 親クラスをViewControllerに変更してビルド

ViewControllerが定義されていないというエラーになります。SwiftからObjective-Cで記述されているクラスが参照できていないためです。

ExampleObjC-Bridging-Header.hでViewController.hをインポートして,参照できるようにします。下記の1行を追加しましょう。

#import "ViewController.h"

これでSwiftからアクセスできるようになり,ビルドが通るようになります。

ちなみに,このクラスが実際に呼び出されるようにするためには,Main.storyboard内のViewに紐づいているView ControllerのCustom ClassをViewControllerからNewViewControllerに変更する必要があります(下図参照)⁠

図8 ViewControllerからNewViewControllerに変更する必要がある

図8 ViewControllerからNewViewControllerに変更する必要がある

この例のように,Objective-Cで書かれた既存のクラスをSwiftで書かれたクラスで継承して,開発を継続していくことができます。もちろん継承するだけではなく,ライブラリを呼び出したりすることも可能です。

著者プロフィール

ogaoga

電機メーカーでソフトウェアエンジニア,UIデザイナーとして様々なプロダクトの開発に従事。現在は,IT企業でフロントエンドエンジニアとして,社内の開発環境の整備や標準化などを推進している。趣味でiOSアプリやWebアプリを開発。

コメント

コメントの記入