Developer's Blog

Swift でもう一度 iOS/OS X アプリ開発に挑戦してみませんか?

Swift-apple

こんにちは。開発担当の木村です。

今年も毎年恒例の一大イベント WWDC が開催されました。
iOS 8 や OS X 10.10 とあわせて4000を超える API が発表され、
開発者のためのイベントとして、例年以上にふさわしい内容だったのではないでしょうか。

中でも私がビビッと来たトピックスは新言語「Swift」の発表です。
これまで Objective-C で開発してきた iOS / OS X アプリがどう変わっていくのか、楽しみで仕方ありません。

iOS / OS X アプリを開発しようと思ったけど、Objective-C がわかりづらくて諦めた。。。
そんな方々も Swift でもう一度  iOS/OS X アプリの開発に挑戦してみませんか。

変数

NSInteger,NSString…と Objective-C のクラスライブラリは独特の型を持っています。
いつも使っている型にNS というプレフィックスが付いているだけで、
何か近寄りがたいオーラを感じた方もいるかもしれません。

//Objective-C
NSString* city = @"Oska";
NSInteger age = 20;
Float height = 190.6f;

これが Swift だとこうなります。

//Swift
var city = "Osaka"
var age = 20
var height = 190.6

型を推論してくれるようになったおかげで先ほどの心配もしなくて良くなりました。
ただし、推論なんて信用出来ない!型がないと落ち着かない!という方は、明示的に指定できます。

//Swift
var city:String = "Osaka"
var age:Int = 20
var height:Float = 190.6

見慣れた型が使えて一安心ですね。

メソッド

メソッドの定義も Objective-C は独特ですよね。
特に引数が2つ以上ある場合のメソッド定義は複雑です。

//Objective-C
(NSString *)greet:(NString *)name label:(int)age { 
    return [NSString stringWithFormat:@"My name is %@.I'm %d years old.", name, age];
} 

 Swift ではどうでしょうか。

//Swift
func greet(name: String, age: Int) -> String { 
    return "My name is \(name).I'm \(age) years old."
}

ずいぶんとスッキリとした書き方ができますね。
Objective-C ではメソッドを呼び出す際にメッセージ式で記述していましたが、Swift では他の言語と同じような書き方でメソッド呼び出しができるようになっています。
Swift では式展開などの文字列操作も簡単になりました。

Objective-C でクロージャを書くためには記号を使う必要があったり、メソッドの呼び出しとは違う書き方で呼び出す必要があったりと少しわかりづらくなっています。
しかし、 Swift ではメソッド呼び出しと同じ書き方でクロージャを実装できます。

クラス

Objective-C ではあるクラスからインスタンスを生成するにも独特の書き方が必要でした。
Hoge クラスのインスタンス hoge を生成するためには

//Objective-C
Hoge* hoge = [[Hoge alloc] init];

と書きます。

一方、 Swiftでは

//Swift
var hoge = Hoge()

と書けます。簡単ですね。
Objective-C では alloc でインスタンスを生成し、init で初期化するという流れでインスタンスを生成しています。
それに比べて、Swift ではサクッと書けるようになっており、イニシャライザを手動で記述する手間も省けていますね。

Objective-C のクラスは宣言部(hoge.h)と実装部(hoge.m)に分かれていました。
Swift ではヘッダファイルが無くなったため、いきなり実装部から書き始められます。

注意点

ここまで Objective-C より良くなった点について挙げてきましたが、 Objective-C から Swift への移行で注意しなければならない点もあります。
その一つとして引数付きの関数・メソッド呼び出す際のバリエーションについて挙げてみます。

Objective-C におけるメソッドは以下の形式で呼び出します。

 [object messageWithArg:arg1 andArg:arg2]

実際にコードを書いてみると以下のようになります。

//メソッド
[object colorWithRed: 1.0 green: 0.0 blue: 1.0]; 

//イニシャライザ
[[Color alloc] initWithColor:1.0 green: 0.0 blue: 1.0]; 

//関数
pow(2, 3)

メソッドとイニシャライザは同じ書き方であることがわかります。
同じコードを Swift で書いてみます。

//メソッド
object.color(1.0, green: 0.0, blue: 1.0)

//イニシャライザ
Color(red: 1.0, green: 0.0, blue: 1.0)

//関数
pow(2, 3)

関数の呼び出し方は Objective-C と同じです。
しかし、メソッドとイニシャライザの呼び出し方が少し変わりました。
Swift では引数の指定方法のバリエーションが増えたことで、少し複雑になっていますね。

・関数の場合

メソッド名 (引数1, 引数2, 引数3)

・メソッドの場合

オブジェクト名.メソッド名 (引数1, ラベル1:引数2, ラベル2:引数3)

・イニシャライザの場合

クラス名 (ラベル1:引数1, ラベル2:引数2, ラベル3:引数3)

Swift に比べて Objective-C の方がシンプルな形でメソッドを呼び出せます。

他にも、Swift では動的な処理を実装するための NSInvocation や performSelector が呼び出せなくなりました。
しかし、Swift は Objective-C で書かれた資産を利用できるため、上記の処理を Objective-C で記述すれば解決できます。

現段階では Objective-C は切っても切れない言語であることは間違いないですね。
Swift を使うと必ずしもいいことばかりというわけではありませんが、Objective-C のようにバージョンアップを重ねていくことで現状の問題をクリアしてくれることを期待しましょう。

まとめ

いかがでしたか?
ここまで Objective-C に苦手意識があった方たちのために、基本的な部分の書き方を解説しました。Swift は全く新しい書き方を求められているのではなく、他の言語と似ている部分も多々あります。そのため、あれ?この書き方どこかで見たことあるぞ?と感じた方も多いのではないでしょうか。

もっと Swift について知りたくなった!という方は Apple 公式の情報も合わせてご覧ください。

Swift – Apple Developer

まだまだ Swift の良い点はたくさんあります。
正式にリリースされればもっと多くの情報が飛び交うようになるでしょう。   
一度 Objective-C に挫折してしまった方もこの機会に再チャレンジしてみてはいかがでしょうか。

 

フェンリルのオフィシャル Twitter アカウントでは、フェンリルプロダクトの最新情報などをつぶやいています。よろしければフォローしてください!

 

Copyright © 2019 Fenrir Inc. All rights reserved.