この記事は aoitaku Advent Calendar 2016 の 5 日目の記事です。
Ruby の次は Swift の話をします。
iOS アプリ開発
今の会社では主に iOS アプリを開発しています。携帯電話の組み込みアプリ開発からプログラマになったぼくがいまこうして iOS アプリ開発をしているというのはなんだか不思議な感慨があります。
作ってるアプリのことはここには書きません。主に Swift のことについて書きます。
Swift 登場
Swift が出てきたときにめちゃびっくりしました。めちゃきれいな構文なんですよね。これといって革新的な言語ではないんだけど、これまでのモダンな言語が取り組んできたことをしっかり踏まえていて、確実にこれは次世代の言語だぞという感じがしていました。
ところが実際に蓋を開けてみるとそうでもなかったりします。
Cocoa 時代の遺産
Swift で iOS アプリを書くということは、これまで Cocoa フレームワークで書かれてきたものの上で Swift を書くということになる。そういうわけで、 Cocoa フレームワークの名残っぽいところがめっちゃある。
たとえば「動詞+前置詞+名詞(引数)」みたいなメソッド名がありますが、これは Objective-C の命名の名残っぽい。前置詞+名詞の部分が長くなりがちで、これがまあいいか悪いかでいうとあんまりよくない。
それでも、 Objective-C と Cocoa フレームワークでコード書くのと Cocoa 時代の名残のある Swift でコード書くのだったら、後者の方がいいんじゃないかなと思っています。
Optional
Swift のいいところその 1。Optional
とかいうやつがあります。
String?
の ?
がそうです。この ?
がついてると nil
を代入可能になります。Optional
でなければ nil
は受け付けません。Optional
以外はいつでも安全に使うことができ、Optional
も Optional Chaining や Optional Binding によって安全に nil
でない値を取り扱うことができるようになります。
Optional Chaining というのは Ruby のぼっち演算子によく似ています。
foo&.bar # hoge が nil ならメソッド bar は呼ばれない
ぼっち演算子というのはこういうやつです。
Optional Chaining はこう。
foo?.bar() // foo が nil ならメソッド bar は呼ばれない
Optional
型は中の値を取り出すためにアンラップする必要があります。 Optional Chaining は nil
だったら何もせず、値があればアンラップしてメソッドを呼び出します。 null 安全にメソッド呼び出しができます。
Optional Binding は nil ガードのための仕組みです。
if let foo = foo {
print("foo は nil でない")
} else {
print("foo は nil")
}
こういう感じのやつ。let foo = foo
で Optional
な foo
をアンラップして foo
に代入してます。nil
だったら else にいきます。これとは別に guard
キーワードというのもあって、こっちは nil
だったら早々にメソッド抜けたいとかそういうときに便利です。
このへんは調べると楽しいと思うので調べてみるといいと思います。
Optional 自体はべつに Swift が先進的なわけではなくて、他の言語にもうある文化でした。Haskell の Maybe とか Scala の Option とかそうです。最近だと Kotlin の Nullable もそうですかね。でも先進的かどうかは別にどうでもよくて、null 安全なコードを書きたい、あるいは書けるようにしていこうという背景があって、Swift もまたそういう背景の中で生まれてきた言語だろう、ということだと思います。
型推論
いいところその 2。
Swift は型推論してくれます。自明な型は省略可能です。でもそもそも Swift の型自体はそんなに書くのは大変ではない印象です。Xcode が補完してくれるというのはあると思いますが。
コレクション
いいところその 3。
配列型とか Dictionary
型とかわりと書きやすいと思います。<>
記法はちょっと書くのしんどいなと思っています。
Map<String, List<String>>
これは Java の例なんですけど、こういうのはちょっと嫌な感じだなあと思っています。
Swift だとこう。
// Dictionary<String, Array<String>>
[String: [String]]
簡潔で好みっぽい。
ブロック
いいところその4。
ブロックが書けます。
list.sort { $0 < $1 }
こういうことできます。
Array
まわりのメソッドが揃っていて、filter
とか map
とか reduce
とかあるので一通りできます。
enum
Swift の enum
は switch
に渡すと足りない case
を警告したりしてくれて便利です。
enum Fruits {
case Apple
case Banana
case Cherry
}
switch fruits {
case Apple:
print("りんごだよ~")
}
こういうことすると Banana
、Cherry
をちゃんと書くか default
書くかしないとダメって言われます。親切。
いいところほかにもある感じですがぱっと思いついた Swift の気に入ってるところはこんな感じです。
そして Swift 3 へ
Cocoa 時代の遺産の話をしましたが、Swift 3 によって、Swift はあたらしいステージに移行すると考えています。
NeXTSTEP に由来する NS というプレフィクスが Swift 3 から消えます。NSString も NSDate もみんなただの String や Date になります。*1
Objective-C といえばという感じのあの長いメソッド名も、前置詞以下が名前付き引数になって、シンプルなインターフェースになります。
完全に Cocoa のことを忘れてしまえるかというとそうではないと思いますが、NS つけてから Xcode に「もう NS はいらんやで~」って言われたりすると「そっか……もう NS はいらないのか……」と不思議な感慨を抱いたりします。
まだ Swift 一年生
ここまでいろいろ書いてきたんだけど、今の会社に入って 11 ヶ月になりますが、iOS アプリ開発にフルコミットしてきたわけではないので、Swift もまだまだ自分の手に馴染んだとは言いがたくて、やっぱり自分で一個 iOS アプリ書いてみたいなーという気持ちがあります。
iOS アプリ以外になにやってきたかというと、二つのことをやっていて、どっちも同じ言語です。同じ言語で二つのことをできるやつ、といえば、もうお察しかと思います。
というわけでまた次回。お楽しみに。
*1:全部なくなるわけではないです