こんにちは。ライターの亀田です。
近頃はスマートフォンのアプリに挑戦する人が増えており、プログラミングスクールで多くの方がプログラミングを学んでいます。
特に人気のあるiPhoneやiPadには、Swift(※)という新しい言語と、Objective-Cという伝統的な言語があり、どちらを学んだらよいのか迷う方も少なくありません。
そこでここでは、この2つの言語を徹底的に比較しどちらが良いのかを考察していきます。
まず最初に
・Objective-CとSwiftの概要
で、それぞれの言語の概要について説明した後に
・それぞれの言語の特徴の比較
・SwiftとObjective-Cの共存
で、2つの言語の違いと使い分けの方法について解説します。
※この記事ではSwift3.1を使用しています。
なお、次の記事ではそもそもSwift言語とはどんなプログラミング言語なのか、その特徴やできることを作れるものや将来性も交えて解説しているので良ければ参考にしてください。
→ プログラミング言語「Swift」とは?特徴からできること、将来性を解説
Objective-CとSwiftの概要
人気のスマートフォンといえばiPhoneということで、Swiftでのプログラミングを勉強し始める人が増えています。
しかし昔からアップル製品向けのアプリを作っていた人から見ると、今まで使ってきたObjective-Cのほうがなじみ深いものです。
結論から先にいうと、それぞれの言語には長所・短所があり、一番良い方法は両者を上手に使い分けることです。
そこでここでは、二つの言語を徹底的に比較し、どちらがどのように優れているか、そしてどのように使い分けたらよいかを説明していきたいと思います。
ObjectiveーCの歴史
Objective-C(オブジェクティブ シー)は、C言語をベースにオブジェクト指向化した言語です。
C言語をオブジェクト指向化した言語というと普通であればC++ということになりますが、Appleは独自の言語を採用したわけです。
その理由は、アップルの創業者であるスティーブ・ジョブズがアップル社に復帰したためです。
ジョブズは一度自分が作ったアップル社から去りましたが、のちに業績不振のアップルに復帰し会社を再建します。
そのとき彼は、自分が作ったNext社という会社と、その製品であるNextStepというワークステーションを手土産に復帰します。
そのマシンのOSの開発に使われていた言語がObjective-Cで、その後この言語がアップル社製品のスタンダードな言語になっていくのです。
この言語が開発されたのは1980年代の半ばで、SmallTalkというオブジェクト指向言語の考え方を導入した当時としては斬新な設計でした。
そかし、そこから20年もたつといろいろな問題点があらわになってきたのです。
Swiftが開発された経緯
前述のようにObjective-Cは、SmallTalkというオブジェクト指向言語をモデルに作られた言語です。
しかし、ベースがC言語という毛色の全く違う言語だというのが問題でした。
そのためバージョンアップを繰り返すたびにギャップからくる言語のいびつさが目立つようになってきました。
また、MacOS自体もどんどん高機能になってきて、開発効率を上げるために新しい言語が必要でした。
その上、ライバルのC++言語もJavaやC#といった次世代の言語に切り替わってきたこともあり、アップル社はObjective-Cにも世代交代の時が迫っていることを痛感しました。
そこで、2014年にWWDCの基調講演でMac OS X Yosemite と iOS 8 の発表と同時に、Swiftが発表されるに至ったのです。
それぞれの言語の特徴の比較
このように、Objective-Cの後継言語として登場したSwift言語なのですが、いったいどの点がObjective-Cより優れているのでしょうか。
また、Objective-Cはいくら古いとはいえ、はたして本当に時代遅れの役立たない言語になってしまったのでしょうか。
ここでは、この2つの言語の具体的な長所・短所を比較し、その点について考察してみましょう。
Objective-Cの長所と短所
Objective-Cの最大の長所でもあり、短所でもあるのが、C言語をベースとした言語であることです。
C言語は時代遅れの言語といわれますが、過去に蓄積されたライブラリ類など膨大な資産があるため、そう簡単に捨てられることもありません。
ただ、欠点としてはObjective-Cの表記が独特でわかりづらい点があげられます。
例えば、日付などの処理をするNSDateというクラスのインスタンスを生成しようとしたら
NSDate *now = [[NSDate alloc]init];
という記述をしなくてはなりません。これはライバルのC++言語に比べてもわかりにくい表現であり、評判はあまりよくありませんでした。
その上、多くのクラスの名前の冒頭にNSという接頭辞がやたらつくというのも問題点として指摘されています。
NSとはNextStepの略で、前述のとおりObjective-CがもともとNextStepの上で使われていたことの名残です。
しかし、現在のユーザーのほとんどはその理由を知る由もなく、Objective-Cは現在ビギナーにとって謎だらけの不思議な言語になってしまったわけです。
Swiftの長所と短所
Swiftは、Objective-Cがかかえている歴史的な負の遺産を清算すると共に、より現代的な言語仕様を持つ言語として生まれ変わるために作られたものです。
たとえば、Objective-Cに限らず、古い言語はnilチェックなどの仕組みが弱かったりもともとなかったりするケースが多いのですが、Swiftにはもともとそれが用意されています。
また、Swiftを用いるとソースコードを短くすることができます。
たとえば、Objective-Cでクラスを定義するときは、以下のように、ヘッダファイル(.hファイル)と、ソースファイル(.mファイル)の2つのファイルを用意する必要がありました。
Car.h
import <Foundation/Foundation.h> @interface Car : NSObject @end
Car.m
import "Car.h" @implementation Car …(中略)… @end
しかし、同様のコードをSwiftで記述しようとすると、
Car.swift
class Car{ …(中略)… }
一目見ればどちらの方が楽かは一目瞭然です。
また、細かいところでは、Swiftでは強力な型推論があったり、実行スピードがObjective-Cを上回るなどといった、非常に優れた点があります。
おまけに、文法もRubyやPythonのような言語に近く、大変表記もスマートです。
しかし、そんなSwiftの最大の弱手は、歴史の浅さゆえすべてのことをSwiftだけではできない点です。
まだまだ、場合によってはObjective-Cの力を借りなくてはならない部分も少なからずあります。
SwiftとObjective-Cの共存
以上のことから現在は、Objective-CとSwiftが上手に共存している状態といえるでしょう。
そこで、ここではこの2つの言語をどのように共存させるかを考えてみましょう。
Swiftを用いた方が良いケース
新しいアプリケーションを作るのであれば、なんといっても断然Swiftを用いるのが良いでしょう。
Swiftで作る良さは言語の仕様が新しいことや、スピードが速いばかりではありません。
実は、Swift には、アプリのメンテナンス性を高めるための工夫がなされています。
たとえば、extensionという機能を用いれば、既存のクラスや構造体・データ型などに後から機能追加をすることができます。
なお、Swiftのextensionについては、以下で解説していますので、参考にしてください。
そのため、古いソースコードの良さを生かしながら新しい機能を盛り込んでいくことも容易になっています。
Objective-Cを用いた方が良いケース
逆にObjective-Cを用いた方が良いケースは、まだまだSwiftが不得意とする分野のライブラリを使用するときでしょう。
仮にSwiftでアプリを作っていたとしてもそういったライブラリを使用せざるを得ない場面にはたびたび遭遇します。
そういう時はSwiftからはライブラリとしてObjective-Cを呼び出すことが可能なので、一つのアプリケーションの中に2つの言語を共存させれば問題は解決します。
Objective-CからSwiftへの変換
ただ、世の中全体の流れから言えば、Objective-Cを廃止してできればすべてをSwiftで記述できるようにする流れが加速しています。
その証拠に、Swiftify、iSwift、objc2swiftといった、複数のObjective-CからSwiftへの変換ツールが存在しています。
これらのツールはまだ完全といえず、一部に変換できないコードがあったり、長いコードの変換ができないといった問題点があるようです。
しかし、世の中の流れは着実に旧言語から新言語への移行する方向に向かっているため、着実に過去の遺産がSwiftに置き換わってきています。
まとめ
以上のように、今回は以下のような流れでObjective-CとSwiftの徹底比較を行ってみました。
・Objective-CとSwiftの概要
・それぞれの言語の特徴の比較
・SwiftとObjective-Cの共存
世の中全体の流れはSwiftが主流のようですが、しばらくはObjective-Cの力を借りなくてはならない状態は続きそうです。
ケースバイケースでどちらを用いるのが適切かを考えて適宜使い分けるのが最も良い方法といえるでしょう。