5日くらいSwiftを勉強したことのまとめ

年末年始でちょっとSwiftを勉強してみたので、やったことをまとめてみた。

読んだ本

詳解 Swift 改訂版

詳解 Swift 改訂版

とりあえず、2冊とも一通り読み終わった*1

詳細! Swift 2 iPhoneアプリ開発 入門ノート

Xcodeをまともに触ったこともなかったので、基本的なXcodeの使い方から説明があって分かりやすかった。

Swiftの基本文法、iPhoneアプリの作り方の基本が書かれている感じ。 StoryboardでComponentをポチポチと置いて、ViewControllerに実装書くとかを試して、なんとなくiPhoneアプリ開発の流れを感じることができた。

詳解 Swift 改訂版

Swiftの細部まで細かく記載されていて、入門ノートでは言及されていない箇所まで勉強できてよかった。 メモリ管理とか、プロトコル指向についても言及されているので、他言語を触ったことある人はこれ1冊読んだらだいぶ理解が進むと思う。

Swiftやって面白かったところ

他の言語をいくつか触っていたのでSwift勉強していても「どこかで見たような機能だなー」ってくらいの感想だったけど、

この2つは他言語に比べて、ちょっと変わっていたのでブログに書いておく。

メモリ管理

今まで触っていた言語でC/C++だとfreeとか書いてたけど、JavaRubyを書いているうちにあまり意識しなくなってた。

しかし、SwiftにはGCがなくて、ARC(Automatic Reference Counting)というメモリ管理方式が使われているため、 参照を意識したプログラムをしないといけない。
このあたりは気をつけないと、GCに慣れたエンジニアはメモリリークとか起こしてしまいそうなので注意が必要。

weakunowned を使うと循環参照を防げるので、最初のうちは気をつけるようにしたい。

プロトコル

個人的にこれが一番衝撃的だった。 プロトコルってのはJavaのインタフェースみたいなもので、このプロトコルに実装を持たせることで多重継承を実現できる。

多重継承はメソッド名の重複が問題になったりするもので、他言語だと「重複はコンパイルエラー」とか「優先度の高い方が選ばれる」みたいなのが多い。
しかし、Swiftではメソッドの重複を許容している。

説明しても分かりづらいので、サンプルコードを書いておく。

protocol StringConvertible {}
extension StringConvertible {
    func toString() -> String {
        return "StringConvertible: \(self)"
    }
}

protocol StringType {}
extension StringType {
    func toString() -> String {
        return "StringType: \(self)"
    }
}

class User : StringConvertible, StringType {}

let userA:StringConvertible = User()
print(userA.toString()) // StringConvertible: User

let userB:StringType = User()
print(userB.toString()) // StringType: User

Rubyとかだとメソッドを上書きしたり、されたりって感じのことができるけど、Swiftだとプロトコルでキャストする感じなんだなーと言語の思想みたいなのが見えて面白かった。

*1:詳解の15, 16章のObj-C連携は飛ばしたけど