Hatena Developer Blog

はてな開発者ブログ

2017年の夏、Swiftをどうやって学ぶか

Xcode 9 betaがリリースされ、Swift 4(とSwift 3.2)の足音が聞こえてくる。このタイミングで、今こそSwiftを学ぼうと考えるのは、なんら不思議なことではない。しかしながら、いざSwiftを学ぼうとしても、どうするのがよいのか、最初は見当もつかないことだろう。ではプロフェッショナルとしてSwiftを利用しているプログラマーたちは、どのようにして学んできたのだろう。


学び方は人それぞれであり、正解はないと考えている。 私の場合は、最初にざっくりと学び、手を動かして慣れ、ようやっと体系的に学ぶという手順を踏むことが多い。

最初のフェーズでは、何が出来るか自分の道具箱には何が追加されるのかと知るためであり、次のフェーズは実際に道具を使ってみて使い方を覚えるフェーズと言える。 そうして道具箱全体が見渡せるようになってきたところで、体系的に学ぶことで効率良く学ぶことが出来ると考えている。 (しかし体系的に学ぶフェーズを飛ばして分かって気になってしまうことがあるので注意と、そして反省が必要だ。)

Swiftを学ぶとときも同様の戦略で学ぼうとした。 最初にiOSアプリ開発の入門書を数冊と、The Swift Programming Language をざっくりと流し読んだ。そしてアプリのコードを書きながら分からないところを調べて少しずつ学び、幸運にも インターンシップで利用している教科書 のSwift 2.2対応をする機会を得て、改めて体系的にSwiftを学び直すことができた。

しかし、これは失敗だったと考えている。 なぜなら、手を動かすためにiOSアプリ開発とSwiftを切り離して学ばずに実践で同時に学ぼうとして非常に効率が悪かったからだ。 
モバイルアプリ開発が初めてであれば、新たに学ぶべき事柄やパラダイムは無数にある。 これらを効率良く学ぶためには、まずSwiftについてある程度学んでおくべきだったと考える。 道具の使い方も知らずにいきなり家を建てることになれば、木は切れないし釘も打てない。

もしもあなたがこれからiOS(Mac)アプリ開発を学ぼうという場合、アプリを作りたいのをぐっとこらえて、最初にSwiftについて一通り学んでみることを提案したい。 きっと効率良くiOS(Mac)アプリ開発を学ぶことが出来るのではないかと筆者は考えている。

––– id:Sixeight


Swiftが2014年6月のWWDCで発表された直後から、Swiftzというライブラリがアクティブに開発されている様子を眺めるなどしていました。Swiftがベータ版の期間中はSwiftのコードをほとんど書くことはなく、実際に仕事で使い始めたのは2014年の10月頃からですが、その時点でSwiftの構文やコードの雰囲気にすでに目が慣れていたため、とても取っ掛かりやすかったことを覚えています。コードは書く時間よりも読む時間の方が長いため、書く前に読む力を身に付けるとよいのではないでしょうか。

また私はObjective-Cの頃からReactiveCocoaというリアクティブプログラミングのライブラリに親しんでいました。ReactiveCocoaを使う過程でその基となったRx.NETに関連する記事を読んだり、関数型プログラミングのパラダイムに慣れるために、Scalaのコードを通じてモナドの概念を勉強していました(Scalaでのモナド解説記事が多かった記憶があります)。これらの学習の殆どはコードリーディングを通じてですが、その基礎がSwiftで OptionalArraymap/flatMap 、他にもパターンマッチなどを使いこなすのに役立ちました。

ところで私はSwiftのコミッターですが、今年に入ってから、Swiftのコアライブラリであるswift-corelibs-foundationへの貢献を断続的に行っており、これも大きな学びになっていると感じています。SwiftのコンパイラーはC++で書かれていますが、標準ライブラリやコアライブラリはSwift自身で書かれています。ものにもよりますが、Swiftの基礎的な知識があればそのコードを読み解いたり変更を加えることは比較的容易です。プログラミング言語のバージョンアップの過程においては、標準ライブラリにも機能追加や新しい言語機能や破壊的変更への追従による変更が加えられるため、言語のアップデートがどのような意味を持つのかをいち早く確かめることができます。

swift-corelibs-xctestswift-package-managerにも多くのSwiftコードがあります。ぜひこれらを入り口に、Swiftを学習すると同時に貢献にもチャレンジしてみてはどうでしょうか。

––– id:ikesyo


私は5年ほど前にiPhoneアプリ開発をはじめました。プログラム経験がほとんどありませんでしたが、iPhoneとMacを購入してアルバイトの面接に持って行き、運の良いことに採用されました。

当時はプログラムについて何も知りませんでした。型、オブジェクト、ファンクションといった基本的な概念を理解していない上に、そういった概念があるということ自体も知りませんでした。そんな当時の私の学習は非常に非効率でした。何を学べばプログラムが書けるようになるかを知らず、その都度つくりたい機能のサンプルが書かれた本を本屋で探していました。時間もお金もかかりました。

もしもこれからプログラミングを学ぶなら、やりたいことを実現するためのコードを探すことに時間をかけるのではなく、プログラムに登場する概念や、その概念が自分の取り組む言語にどう実現されているか、そして、それらを活用してどのようにプロダクトを作っていくのかという視点で学習することをおすすめします。Swift言語について学ぶのであれば、まずは公式のドキュメントや、書籍 詳解Swift などがおすすめです。

それから、もしあなたが学生ならば、はてなのインターンに参加することをおすすめします。はてなのインターンには素晴らしいSwiftの教科書と、素晴らしいiOSアプリ開発の教科書(とサンプルコード)が用意されていて、言語仕様を学ぶところから、それをプロダクトに活用して実践的なコードを書く(そしてそれが世に出て動く)ところまでを体験することが出来ます。それが2週間に凝縮されています。これは理想的な体験だと思います。

学生でなくてもご安心ください。はてなのインターンの教材はGitHubで公開されています。私自身、はてなに入ってからSwiftを書き始めましたが、その際には、はてなインターンの教科書を教材としました。非常に良い内容だと思っています。Swiftについて調べるために検索していたら偶然にも的確な答えを示してくれたのがこの教科書だったこともあります。はてなインターンの教科書は一気に読み通すことのできる分量で、網羅的に、そして簡潔に実践において必要なSwiftの要点がまとめられています。サンプルのアプリケーションでは、無用にライブラリに頼ること無く、プレーンなSwiftをうまく活用して機能を実現する好例になっているはずです。

––– id:niwatako


PR

応募〆切は来週月曜 2017年6月26日(月)!!!


ずっと Android ばかりやってきましたが、iOS のタスクを希望した所、最近アサインされるようになりました。その為最近は Android タスクと並行して、iOS の学習及びタスクを進めています。現状、どのように iOS(Swift) のタスクを進めているのかを共有したいと思います。

読む

まずは知識が必要なので本を読むか、ドキュメントを読むなどします。序盤はとりあえず助走するために本を読み始めました。読んだ本はこちらです。

Swift実践入門 ──直感的な文法と安全性を兼ね備えた言語:書籍案内|技術評論社

僕はこれまでずっと Android で Java を書いてきたので、とにかくモダンな書き方に驚きだらけです。

次にプロダクトのコードも読んでいきます。最もこれはタスクがアサインされてからの場合がほとんですが。僕のチームでは「はてなブックマーク」の iOS 版と Android 版を開発しており、僕は元来、後者の担当でした。iOS の業務経験はありません。

iOS のコードを読むということは iOS フレームワークを理解する必要がるため、Swift の知識だけでは理解が困難です。しかしながら、はてなブックマークの iOS 版のアプリと Android 版のアプリは両者ともに大体同じ機能を提供していますし、API のコードからたどればどんな機能なのか分かるので「Android で実現していた機能はここか」と頭のなかで照らし合わせながら世界観を把握できます。そもそもどちらもスマートフォンのアプリケーションなので、差はありながらも何となく似ているというか、例えば Android で RecycleView を使って実現してる View の実装は iOS だとこうなっているのか、という発見があります。そういった似ているところを手がかりに Swift のコードを読み進めていきます。本で読んだ所が出てきたら理解が深まりますし、理解できないような書き方の場合は調べるか質問するなどして実践で使えるようにしていきます。

書く

仕事で iOS のタスクをアサインされるので、(関係ありそうなところを読んだあとに)頑張って書きます。わからないところは本を読み返したりドキュメントを見たり、既存のコードを発見して参考にします。特にプロダクトのコードは全てレビューを通っているコードなので恰好のお手本になります(ただ単に Swift の書き方がわかると言うより、プロダクトで統一された書き方を学ぶという意味合いが大きい)。

僕ははじめ、API の新設タスクを行いました。API を新しくし、エンドポイントを作り、モデルを作る。それを古いモデルを使っているリスト表示の UI に反映するというものです。しかしこれは「Swift の理解」 と 「iOS フレームワークの理解」 及び 「開発者ツールの理解」を一気にやる必要があったので、どうしても速度は出ません。それはもうしょうがないと思います。速度を出すのが目的ではないので、一行ずつ、疑問のあるところ、書いたものの更に良くかけそうなところ、すべてじっくり調べて進めていきます。

このタスクで良かったのはテストを書けたということです。初心者なので、どうしても書いたコードには不安がつきまといます。テストがあれば、わざわざ人力でボタンをタップして〜などする必要なく、素早くコードの信憑性を確認できます。テストの書き方は Quick を使い、書き方の方針が決まっているため、初心者でも簡単に真似することができました。

聞く

調べても分からなかったら聞くしかありません。とは言え序盤は詰まりまくるので、その都度席を移動して「すみません…」というのも億劫です。しかしながら最近、僕の所属するチームはとある時間になると席を移動して、なるべくチームメンバーが近くに座り「みんなで仕事する時間」をはじめました。このため細かな質問をし易い体制でした。また質問まで行かなくとも、誰かに「ここ今こうしてるけど、どうしようか迷っている。今考えているのは〜」というような会話を投げかけると、何故か自分でどうすればよいか見えてくるというのも最近わかってきました。

見せる

あとはレビューをしてもらって、自分のコードにどれぐらいの間違いがあるのかを確認します。単純に間違いがあれば修正し、そうでなければマージします。

まとめ

まだはじめて2週間程度ですが、基本的に上の「読む」「書く」「聞く」「見せる」というサイクルを回して進めています。正直な所、新しい言語を覚えるのはインターンシップ以来なので、本当に学習手順はこれでいいのかとか、ちゃんと数カ月後には開発速度が出せる様になるのかなどの不安はありますが、現状クリティカルな問題点は無いと思いますので、しばらくこのスタイルで様子を見ていこうかと思っています。

––– id:funnelbit


Swiftで小さなプログラムを書けるようになった次にはprotocolについて学ぶとよいでしょう。 小さいプログラムではさほど必要にはなりませんが、もし継続開発するアプリケーションを書くならば知っておいて損はありません。 簡単な例として、Equatable実装を見てみましょう。

Equatableを適用するオブジェクトが実装すべきメソッドは、同値性を比較する == のみです。 同値性を比較する==が実装されているということは、反対を示す!=は自ずと決まりますので、これにはデフォルト実装が用意されています(このprotocolが持つ実装をprotocol extensionと呼びます)。 Swiftではこのようにprotocolを用いて振る舞いや処理を集約することができます。 一見まわりくどい手法に見えますが、protocolを使うことには利点があります。

クラスによる継承では、実装を共有したいがため変な継承関係を持ってしまうことやいたずらに深い継承関係を作ってしまうことがあります。 protocolによる抽象化とprotocol extensionによる実装の共有では、そのような問題を解決することができます。 Equatableの例で考えてみると、クラスベースの継承でこの特性を実現しようとすると痛い目を見ることが目に見えています。 また、classだけでなくstructなどの値型にも適用できるため適用範囲が広いという利点もあります。

加えて、実装への依存が緩和される点も見逃せません。 Javaではよくinterfaceを使って実装への依存を弱めるテクニックが使われます。 基本的にはSwiftのprotocolも同じことを実現しています。 依存を実装ではなくprotocolに向けることで実装の変更がしやすくなります。 実装を変更することはあまり無いと感じるかもしれませんが、これによりモックが容易になりユニットテストが書きやすくなります。

protocolを使うと、データとそれになにができるのかということに注目してプログラミングできます。 はてな教科書でもprotocolの基本的な使い方が解説されています。 値型を使ってよりシンプルでメンテナンスしやすいプログラムを書くために、うまくprotocolを役立ててください。

––– id:yashigani_w


これを読んでいるあなたは、Androidアプリエンジニアでしょうか。 普段ずっとJavaでAndroidアプリを書いているが、仕事あるいは趣味でiOSアプリを書くことになったので、Swiftをどう学べばいいか知りたくてこの記事を読んでいるのでしょうか。

もしあなたがSwiftを学ぶことが緊急ではなく、他にも色々学びたいと考えているならば、まずSwiftを学ぶ前にKotlinについて学ぶとよいでしょう。

なぜ先にKotlinを学ぶべきなのか疑問に思うでしょう。文法が似ているから?同じOSSのプログラミング言語だから? 答えはシンプルです、KotlinがSwiftと同様モダンなプログラミング言語であるからです。

KotlinはIntelliJ IDEAやAppCodeを開発しているJetBrains社が開発しているJVM言語の一つです。 Swiftと似た文法(もちろん細かいところは違います)や、NullPointerExceptionに悩むJavaプログラマーも喜ぶnon-null/nullableのサポート、型推論、ラムダ式、拡張関数などモダンな要素を詰め込んだ言語です。 今年のGoogle I/OではAndroidアプリ開発の言語として公式に認められ、プロダクションへの導入障壁もかなり下がりました。

Swiftを学ぶ前にまず慣れ親しんだAndroidアプリの開発でKotlinを学んで、モダンなプログラミング言語の使い方に慣れるとよいでしょう。 そうすることで、次にSwiftを学んでiOSアプリの開発を行う時にある程度の前提知識がある状態で進めることができ、スラスラ学ぶことができるかもしれません。

––– id:takuji31


2014年に発表されたばかりのSwiftを学ぼうとした時、Appleのドキュメント「The Swift Programming Language」を読むしかなかった。2015年のインターンシップのためにSwiftの教科書を書こうとした時、やはりもう一度同じドキュメントを読んだ。Apple公式のこのドキュメントは、Swiftの言語仕様について単に網羅的に説明しているだけでなく、個々の機能がSwiftの根底にある思想に基づいて整理されている。繰り返し読み込むことで、それが理解できるようになるはずだ。

もしあなたが以前にSwiftを学んでおり、より新しい言語仕様を知ろうとするなら、Swiftの意思決定プロセスであるswift-evolutionに挙げられている提案を読むとよいだろう。提案は受け入れられたものだけでなく否決されたものもあり、それぞれがSwiftの目指す方向性をより鮮明にしている。

一方であなたが経験豊富なプログラマーで、初めてSwiftを学ぼうとするなら、より省力的に学びたいと考えるかもしれない。安心してほしい。私たちのインターンシップで利用している教科書が公開されている。言語仕様の大半を簡潔に説明しており、さらによいことにドキュメントへの参照が各所に含まれている。

そして最後に、あなたがちょうど学生であるなら、Swiftを学ぶ最良の方法がある。それははてなのインターンシップに申し込むことだ。インターンシップではSwiftで実際に開発されているiOSアプリの機能開発を体験できる。応募締め切りが迫っているから急ぐとよいだろう。

––– id:cockscomb


Swiftを学ぶ方法は、人によって様々である。しかしこれを読んだあなたにとっては、その方法はたった一つしかない。

はてなサマーインターンでサクセス!!今すぐ応募!!!

developer.hatenastaff.com