読者です 読者をやめる 読者になる 読者になる

aoitaku Advent Calendar 2016 : 5日目 - Swift

この記事は aoitaku Advent Calendar 2016 の 5 日目の記事です。

Ruby の次は Swift の話をします。

iOS アプリ開発

今の会社では主に iOS アプリを開発しています。携帯電話の組み込みアプリ開発からプログラマになったぼくがいまこうして iOS アプリ開発をしているというのはなんだか不思議な感慨があります。
作ってるアプリのことはここには書きません。主に Swift のことについて書きます。

Swift 登場

Swift が出てきたときにめちゃびっくりしました。めちゃきれいな構文なんですよね。これといって革新的な言語ではないんだけど、これまでのモダンな言語が取り組んできたことをしっかり踏まえていて、確実にこれは次世代の言語だぞという感じがしていました。

ところが実際に蓋を開けてみるとそうでもなかったりします。

Cocoa 時代の遺産

Swift で iOS アプリを書くということは、これまで Cocoa フレームワークで書かれてきたものの上で Swift を書くということになる。そういうわけで、 Cocoa フレームワークの名残っぽいところがめっちゃある。

たとえば「動詞+前置詞+名詞(引数)」みたいなメソッド名がありますが、これは Objective-C の命名の名残っぽい。前置詞+名詞の部分が長くなりがちで、これがまあいいか悪いかでいうとあんまりよくない。

それでも、 Objective-CCocoa フレームワークでコード書くのと 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 = fooOptionalfoo をアンラップして 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 の enumswitch に渡すと足りない case を警告したりしてくれて便利です。

enum Fruits {
    case Apple
    case Banana
    case Cherry
}

switch fruits {
case Apple:
  print("りんごだよ~")
}

こういうことすると BananaCherry をちゃんと書くか 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:全部なくなるわけではないです