『Swift実践入門』2月7日発売

 海外事業向けのiOSアプリケーション開発を担当している西山(@yuseinishiyama)です。より海外事業に注力するため、今年度から、海外事業の拠点であるイギリス、Bristolのオフィスに出向しています。クックパッドは現在、15言語、58カ国以上を対象にサービスを展開しています。

 先日、ヴァンサンが国内向けのアプリケーションのSwift 3化に関する記事を投稿しました。同じく、海外向けのアプリケーションも、昨年12月にSwift 3化した最初のバージョンをリリースしました。以前、Swift移行の記事で説明したとおり、このプロジェクトはほぼSwiftによって実装されているため、Swift 3化によってほぼ全てのコードが影響を受けました。幸いにも、大きなトラブルは起きませんでした。

 この度、こうした業務での経験を活かして、『Swift実践入門』という書籍を技術評論社のWEB+DB PRESS plusシリーズから2月7日に発売することになりましたので、この場を借りて宣伝させていただきます。APIKitなどで著名な@_ishkawaさんとの共著となります。

Swift実践入門 ── 直感的な文法と安全性を兼ね備えた言語 (WEB+DB PRESS plus)

Swift実践入門 ── 直感的な文法と安全性を兼ね備えた言語 (WEB+DB PRESS plus)

 また、刊行記念のイベントも開催することになりましたので、興味のある方はぜひご参加ください。

執筆の動機 〜Swiftのwhyとwhenの解消〜

 SwiftがAppleから発表されたのは2014年です。安全かつ簡潔な文法という触れ込みが印象的でした。iOS開発者としては当然居ても立ってもいられず、発表後すぐ、beta版の公式ドキュメントの全てに目を通しました。そこで強く感じたことは、「簡潔ではあるが簡単ではない」ということです。Objective-Cのユニークな記法と比較すると、フレンドリーな見た目にはなりましたが、その豊富な言語仕様を適切に使いこなすのは容易ではないと思いました。

 Appleの公式ドキュメントをはじめとして、どんな(what)言語仕様があり、それらをどのように(how)使うかに関しては早い段階から豊富な情報源がありましたが、それらがなぜ(why)存在し、いつ(when)使うべきかについてまとまった情報があるとは言えない状況でした。『Swift実践入門』はこうした状況を解消することを主眼としています。

Swiftの難しさ 〜Swiftらしいコードを書くために必要な知識〜

 単にSwiftでコードを書くことと、Swiftらしいコードを書くことは別のことです。ここで言うSwiftらしさとは、Swiftがその言語仕様を持って実現したい世界に倣ったコードのことです。Swiftは豊富な言語仕様を持っていますが、それは同時に、豊富な選択肢があるということを意味します。全てのケースに当てはめれるような解があるわけではなく、それぞれの仕様の存在意義を明確に把握し、都度適切な判断を下さなければなりません。

 初学者がSwiftの言語仕様をある程度理解した後に躓きやすい典型的な箇所として、次のようなものが挙げられます(「使い分け」という言葉が繰り返し登場することから、同じことをするにも複数の方法があることが見て取れるでしょう)。

  • Optional<Wrapped>の使い所
  • 高機能なパターンマッチ
  • モジュールのアクセスレベル
  • プロトコルと継承の使い分け
  • キャプチャリストの使い分け(weakunowned、何もつけない)
  • 値型と参照型使い分け
  • ifguardの使い分け
  • 定数と変数の使い分け
  • エラー処理の使い分け(Optional<Wrapped>do-catchResult<T, Error>)

 例えば、「Optional<Wrapped>の使い所」を説明するために、書籍内では次のようなコードが登場します。どちらにどのようなメリットがあるか適切に説明できるでしょうか。

// 全てのプロパティがOptional<Wrapped>型のケース
struct User {
    let id: Int?
    let name: String?
    let mailAddress: String?

    init(json: [String : Any]) {
        id = json["id"] as? Int
        name = json["name"] as? String
        mailAddress = json["mailAddress"] as? String
    }
}

// Failable Initializerを使うケース
struct User {
    let id: Int
    let name: String
    let mailAddress: String?

    init?(json: [String : Any]) {
        guard let id = json["age"] as? Int,
              let name = json["name"] as? String else {
            return nil
        }

        self.id = id
        self.name = name
        self.mailAddress = json["email"] as? String
    }
}

 『Swift実践入門』は、これらのこと1つ1つ言及し、読者のwhywhenを解消します。

おわりに

 『Swift実践入門』はその名の通り、単なる入門書や言語仕様の解説にとどまらない、実践的な内容を扱っています。著者2人で450ページ強というなかなかのボリュームですが、これからSwiftをはじめようという方から、よりその知識を深めたいという方にまで、ぜひ手にとっていただきたい一冊です。

 一方、『Swift実践入門』は実践的な書籍ではありますが、やはり本当の意味での「実践」からしか得られないこともたくさんあります。例えば、クックパッドでは長期間に渡って大量のユーザーを支えることができるアプリケーションを構築する必要がありますが、そのためにはさらに進んだトピックに取り組まなければいけません。例えば、チームに最適化されたStyle Guideを制定したり、肥大化するビルド時間に対処することがそれにあたります。

 クックパッドでは、こうしたAdvancedな課題に対処したいSwiftエンジニアも募集しています。

国内事業: https://recruit.cookpad.com/jobs/career_recruitment/ios-android/

海外事業: TokyoBristol

/* */ @import "/css/theme/report/report.css"; /* */ /* */ body{ background-image: url('http://cdn-ak.f.st-hatena.com/images/fotolife/c/cookpadtech/20140527/20140527163350.png'); background-repeat: repeat-x; background-color:transparent; background-attachment: scroll; background-position: left top;} /* */ body{ border-top: 3px solid orange; color: #3c3c3c; font-family: 'Helvetica Neue', Helvetica, 'ヒラギノ角ゴ Pro W3', 'Hiragino Kaku Gothic Pro', Meiryo, Osaka, 'MS Pゴシック', sans-serif; line-height: 1.8; font-size: 16px; } a { text-decoration: underline; color: #693e1c; } a:hover { color: #80400e; text-decoration: underline; } .entry-title a{ color: rgb(176, 108, 28); cursor: auto; display: inline; font-family: 'Helvetica Neue', Helvetica, 'ヒラギノ角ゴ Pro W3', 'Hiragino Kaku Gothic Pro', Meiryo, Osaka, 'MS Pゴシック', sans-serif; font-size: 30px; font-weight: bold; height: auto; line-height: 40.5px; text-decoration: underline solid rgb(176, 108, 28); width: auto; line-height: 1.35; } .date a { color: #9b8b6c; font-size: 14px; text-decoration: none; font-weight: normal; } .urllist-title-link { font-size: 14px; } /* Recent Entries */ .recent-entries a{ color: #693e1c; } .recent-entries a:visited { color: #4d2200; text-decoration: none; } .hatena-module-recent-entries li { padding-bottom: 8px; border-bottom-width: 0px; } /*Widget*/ .hatena-module-body li { list-style-type: circle; } .hatena-module-body a{ text-decoration: none; } .hatena-module-body a:hover{ text-decoration: underline; } /* Widget name */ .hatena-module-title, .hatena-module-title a{ color: #b06c1c; margin-top: 20px; margin-bottom: 7px; } /* work frame*/ #container { width: 970px; text-align: center; margin: 0 auto; background: transparent; padding: 0 30px; } #wrapper { float: left; overflow: hidden; width: 660px; } #box2 { width: 240px; float: right; font-size: 14px; word-wrap: break-word; } /*#blog-title-inner{*/ /*margin-top: 3px;*/ /*height: 125px;*/ /*background-position: left 0px;*/ /*}*/ /*.header-image-only #blog-title-inner {*/ /*background-repeat: no-repeat;*/ /*position: relative;*/ /*height: 200px;*/ /*display: none;*/ /*}*/ /*#blog-title {*/ /*margin-top: 3px;*/ /*height: 125px;*/ /*background-image: url('http://cdn-ak.f.st-hatena.com/images/fotolife/c/cookpadtech/20140527/20140527172848.png');*/ /*background-repeat: no-repeat;*/ /*background-position: left 0px;*/ /*}*/