Objective-CとSwiftを使ってみよう – はじめに

注意: この記事は1年以上前に掲載されたものです。情報が古い場合がありますのでお気を付け下さい。

近年、iOSのアプリ開発での主流はこれまでのObjective-CからSwiftに変わりつつある。しかしながら、ライブラリーの開発を中心にコンパイラーの問題、およびC++との連携などでSwiftではなかなか解決できない問題も残っており、その影響を受けないObjective-Cの需要も依然として需要がある。ここでは、Objective-CとSwiftの両方を初めて学習する方向けに説明を行ってみたい。なお、今回は実際に開発は行わず、説明を行いたい。

Objective-Cとは

まず、Objective-Cについて説明を行いたい。Objective-Cは1983年に登場したC言語の仕様にSmalltalkライクなオブジェクト指向機能を追加したもので、その記法は[obj doSomething];といったように、かなり独特なものになっている。

1985年にはスティーブ・ジョブス氏率いるNeXT Computer社より提供されたNEXTSTEPのの基幹環境を使うための言語として採用されるようになり、当時は商業的には失敗したものの、技術的には大きな功績をあげ、後のmacOS、iOS、tvOS、watchOSにつながる成果を挙げた。

基本的にはC言語の特徴を全て引き継いでおり、以下の利点と難点を持っている。

  • C言語およびC++のコードに直接的または間接的にアクセスできる。
  • C言語およびC++の機能のほぼ全てを使える。一方で危険性もCおよびC++とほぼ同等である。
  • メモリー領域の確保・解放は手動で行う必要がある。 ((Apple版ではAuto Reference Countingを使えば強い参照・弱い参照を意識する必要はあるもののコンパイラーレベルで自動的に行われる。GNU版ではBoehm GCによるガベージコレクションを使うこともできる。))

Objective-CではCやC++の遺産を比較的容易に利用できる利点はあり、言語仕様も後述のSwiftに合わせて拡張・改善されてはいるものの、かなり古い言語となっている状態にある。

Swiftとは

一方、SwiftはWDDC2014で発表された、まだ2年半ほどの歴史しかない新しい言語で、Objective-Cでは問題となった使いにくさの解消を図った言語といえる存在である。「Objective-C without C」というキャッチフレーズの通り、言語仕様およびフレームワーク面ではObjective-CからCの機能を排除したようなものになっている。一方で、既存のObjective-Cライブラリーとの親和性も確保しており、ブリッジヘッダーやフレームワークなどを使うことによって、Objective-Cのコードに直接アクセス。C++でもObjective-C++を介せば大丈夫になっている。

また、Objective-Cと比較して、かなり強い型付けがなされており、指定した型でなければコンパイルが通らない、あるいはそれがNullを許容するのかといった判別もできるようになっている。

一方で、Swiftでは、コンパイラーのバージョン違いでもビルドが通らないようになっているほどの厳密さ、言語仕様の変更の速さなどから、常に変化を求められるものとなっており、多くのプラットフォームをサポートすることが求められるライブラリー開発にはあまり向かない面もある。

Hello, worldではこんなに違う

さて、Objective-CとSwiftについて説明を行った。ここでは、まず最初の儀式である、「Hello, world」を出力するコードを書いてみよう。

Objective-C (Apple)

#include <stdio.h>

int main() {
    printf("Hello,world\n");
    return 0;
}

Swift

print("Hello, world");

今回の場合は、Objective-Cといっても、実際にはC言語のコードしか書いていないが、これをObjective-Cのコードとしてビルドすることもできる。

一方、Swiftでは1行で済んでしまっている。もちろん本格的なプログラミングではこうなることは基本的にないが、Objective-Cでmain()メソッドに入っているものとの違いと見比べてみると良いだろう。

最後に

今回はObjective-CとSwiftに関する簡単な説明を行った。次はそれぞれの環境構築について説明を行ってみたい。次はMacを使っていればもっとも楽、次点でUbuntu、最後にWindowsとなるので、その点はご了承願いたい。

タイトルとURLをコピーしました