前回の記事でiOSアプリ開発におけるイケイケライブラリたちをご紹介したわけだが、
この記事を読んでくださったスーパーハッカーの皆様ならもうすでにそのいくつかをご自身のプロジェクトに取り入れる、
ないしは取り入れようとしているハズである。
そしてそろそろ絶望を味わっている頃ではないだろうか。
そう、プロジェクトの言語とライブラリの言語が合わないということに。
2014年のWWDCにおいて一般に発表され、当時のiOSアプリ開発者たちを見えない恐怖に陥れたSwiftは、
"モダン"という漠然としたキラーワードでたちまちiOSアプリ開発におけるメジャー言語へと台頭した。
既存のアプリ改修はともかく、新規でアプリを開発するとなった場合、圧倒的にSwiftで開発をスタートするケースがほとんどだと思うが、
たまにいるのである、過去の遺産にとらわれて亡霊(Objective-C)から逃れられないエンジニアが。そう、私のことである。
今回のお話は、大衆がSwift!Swift!と叫ぶ中、やっぱりObjective-Cは最高だぜとつぶやく時代遅れのエンジニアの小さな抵抗の物語である。
閑話休題
さて、イケイケライブラリを見つけたはいいものの、ここ最近はSwiftでかかれたライブラリが増えてきており、
Objective-Cのプロジェクトに組み込む際に、若干の注意が必要である。
Objective-CのクラスからSwiftのクラスを呼び出す
Objective-Cベースのプロジェクトにおいて、Swiftのファイル(.swift)を追加後にビルドすると、
**"プロジェクト名-Swift.h"**というブリッジファイルが自動生成される。
コイツをSwiftを呼び出したいObjective-Cのファイルでインポートするだけ。
#import "プロジェクト名-Swift.h"
プロジェクト内に存在するすべてのSwiftファイルのクラス, およびメソッドがこのファイルに定義される。
ただ、Swift側のクラスが**NSObjectを継承したクラス
や@objc
**を付けたクラスでなければならないこと、
Swift側のクラスの一部のメソッドが定義されず使用することができないことがある、という点を知っておかなければならない。
これはSwiftから新たに追加されたクラスや、Objective-Cでは使えない型があるためである。
自分はSwiftのライブラリにメソッドを自作で追加して(ココで結局Swift言語でコードをかくハメになったのだが…)
ブリッジファイルに定義されるようにカスタマイズして対応した。
(Swift側で新しくメソッドやプロパティを追加した場合は、再ビルドしたタイミングでブリッジファイルに反映される)
ちなみに、
Build Settings -> Swift Compiler - General の中に、
Objective-c Generated Interface Header Name -> プロジェクト名-Swift.h
と定義されている。
また、"プロジェクト名-Swift.h"内に定義されたクラスであっても、
Objective-C側でそのクラスを継承したクラスを作ることはできない。
まぁ、当然と言ってしまえば当然なのだが、自分は結構ライブラリのクラスを継承して、
さらにカスタムクラスを作らなければ対応できないことが多々あったので、一応試した結果である。
Xcode8でSwift2.3を使い続ける
2016年9月13日にXcode8が正式リリースされ、Swift3がXcodeにおけるプライマリな言語になった。
Swift3.0ではSwift2.3と比べ、構文やAPI名など多岐に渡って変更点があったようだ。
早速Xcode8にアップデートし、プロジェクトをビルドしたところ、
Swift Compiler Error
が大量に発生し、心が壊れそうになる。
一応、Xcode8にはSwift3.0への自動コンバート機能が用意されており、
Use Legacy Swift Language Version
というエラーとともに、全力でSwift3.0へのコンバートを推奨される。
Edit -> Convert -> Convert To Current Swift Syntax から、
Xcodeの指示にしたがってポチポチしていくと、Swift3.0へのコンバートができる。
ただ、コンバートしたあとにもエラーがかなり残っており、1つずつ直していく作業を延々とこなした後、
ようやくビルドを通すことができた。
そこでもう一人の自分が囁いたのである、"まだSwiftと向き合う時ではない"と。
プロジェクトのswift言語バージョンを設定する
TARGETS -> Build Setting -> Swift Compiler -> Use Legacy Swift Language Version を YES
に設定する。
コレでXcode8でもSwift2.3をコンパイルすることができるようになる。
実際にビルドしてみたところ、数カ所エラーが残ったものの、ほぼ既存コードのまま使うことがきた。
結
序章に比べて内容がかなり薄かった気がするが、
それだけSwift言語から逃げることが今のところ簡単だということだろう。
今のところ。
気が早いもので、Swift4のリリース計画もすでに組まれていて(2017秋とのことである)、
Xcodeでobjective-Cがビルドできなくなる日もそう遠くはないような気がするので、
今のうちからSwiftもキャッチアップしていきたいものである。
と、自分自身に言い聞かせる。