今回のエンジニアブログを担当する村田です。
Swiftの勉強会を開催し、Swift未経験者にワークショップを開くことがあります。
使用する教材はApple公式ドキュメント「A Swift Tour」。
「A Swift Tour」とXcodeを使い、参加者のみなさんにSwiftの基礎を学んでいただいてます。
今回はみなさんと「A Swift Tour」を巡る際に、追加で説明している点などをまとめたいと思います。
前準備:Playground
「A Swift Tour」を巡る際は、Xcodeを使ってサンプルプログラムをコーディングします。
通常のプロジェクトを用いて、コーディング⇔ビルドを行ったり来たりしていては、時間が掛かってしまい不便です。
Xcode 6からは「Playground」というものが用意されております。
コーディングした内容がすぐ実行され、結果が表示されるので、学習するのにとても便利です。
Playgroundの作り方は二通りあります。
Playgroundの生成に成功すると、以下のような画面が表示されます。
画面右側で、変数の中身(値)をすぐに確認できるのがポイントです。
「A Swift Tour」の巡り方
基本的には、『上から読んでいき、記載されているソースコードをPlayground上で実行する!』です。
「A Swift Tour」は英語しかありませんが、ソースコードがありますし、
書いてある内容をそのままPlaygroundに打ち込むとすぐに結果が分かるので、そこまで困ることはありません。
「EXPERIMENT」欄は、「試してみよう!」といった内容です。
記載されているソースコードを打ち込むだけなく「EXPERIMENT」を実践することで、よりSwiftへの理解が深まります。
それでは、各章で補足している内容を記載します。
println文
「A Swift Tour」は
println("Hello, playground")
で、はじまります。
printlnなので、標準出力画面が欲しくなります。
どのようにすれば、標準出力が表示されるのかと言いますと、
「Console Output」がprintlnの出力先になります。
printlnを使って挙動を細かく確認したい場合は、「Console Output」を出しておくことをオススメします。
ただ、この新たなビューが右側に出ることでエディター領域が狭まり、邪魔な場合があります。
このビューの表示位置を変更したい場合は、メニューの[View] - [Assistant Editor]から好きな配置を選びましょう。
Simple Values
この章は、変数・定数や、array・dictionaryなので、処理としては複雑なことはありません。
一番聞かれるのが、バックスラッシュ(\)の入力方法です。
英字キーボードの場合は、バックスラッシュキーがあるので迷いませんが、JISキーボードの場合は迷います。
JISキーボードの場合は、『optionキーを押しながら、¥キーを押す』と入力できます。
あと追加で説明しているのは、実用性はありませんが、こちらです。
変数やfunc名に使える文字がUnicodeとなっているので、日本語や絵文字が使える点です。
日本語の変数を見ると、昔のVisual Basicを思い出します...
Control Flow
まず最初のfor文をPlaygroundで実行すると聞かれるのが、下図の赤枠の部分です。
Playgroundでは、制御文のどこを何回通過したのか表示されます。
ただし、次のように通過回数が一回の場合は、回数ではなく実行結果が表示されます。ここも聞かれるポイントです。
あと、追加で説明しているのが、特定の条件を除き switch文にはdefaultが必須であることです。
実際にdefaultを削除していただき、結果がどうなるのか確認します。
Functions and Closures
まずは、2つ目の例でタプルが出てくるところです。
タプルは、複数のオブジェクトをまとめて扱えるもので、インデックスかラベルを付けている場合はラベル名でアクセス可能です。
ここでは、ラベルを取ると挙動がどうなるか、を試します。
色々触っていただくことで、タプルがどんなものなのかを理解していただきます。
あとは、Closureを理解していただくところがポイントです。
C/C++経験者には、関数ポインタに置き換えると理解していただけます。
Objects and Classes
4つ目の例で追加説明をします。
class Square: NamedShape { var sideLength: Double init(sideLength: Double, name: String) { self.sideLength = sideLength super.init(name: name) numberOfSides = 4 }
ここではよく、6行目のsuper.initを一行上に持って行くと、どうなるでしょう?を試してみます。
試してみると、クラス変数のsideLengthが初期化される前にsuper.initを呼び出すのでエラーとなります。
対応方法として、クラス変数を初期化するか、
class Square: NamedShape { var sideLength: Double = 0.0 init(sideLength: Double, name: String) { super.init(name: name) self.sideLength = sideLength numberOfSides = 4 }
今回のケースは必ず値が入りますので、"!"を付与します。
class Square: NamedShape { var sideLength: Double! init(sideLength: Double, name: String) { super.init(name: name) self.sideLength = sideLength numberOfSides = 4 }
本ブログでは、"?"と"!"の違いは長くなるので割愛します。
Googleで「swift オプショナル」で検索すると、詳しく書かれた記事が出てきます。
Enumerations and Structures
まず、3つ目の例で、追加の説明をします。
先ほど、switch文にはdefaultが必須と記述しましたが、defaultを書かなくても大丈夫な例です。
ここでは self が取り得る値が全て case に記載されているので、default が不要です。
よく試すのが、一つ case を取ってみます。もちろんエラーとなります。
Protocols and Extensions
ここで追加説明するのが、protocolに書かれたmutatingです。
protocol ExampleProtocol { var simpleDescription: String { get } mutating func adjust() }
これだけ見ると、protocolに定義したfuncにはmutatingが必要なのでは?と思います。
しかし、このように記述してもエラーは出ません。
protocol ExampleProtocol { var simpleDescription: String { get } func adjust() } class SimpleClass: ExampleProtocol { var simpleDescription: String = "A very simple class." var anotherProperty: Int = 69105 func adjust() { simpleDescription += " Now 100% adjusted." } } var a = SimpleClass() a.adjust() let aDescription = a.simpleDescription
なぜ、mutatingが必要なのか。
次のStructureのadjust()内で変数simpleDescriptionの値を変更しているためです。
struct SimpleStructure: ExampleProtocol { var simpleDescription: String = "A simple structure" mutating func adjust() { simpleDescription += " (adjusted)" } }
「Enumerations and Structures」章では説明されませんでしたが、
Structuresのfunc内で、Structuresが持つ変数を変更する場合は、mutatingを付ける必要があります。
Generics
最後の例が、うわっっとなり、複雑ですよね。
for文を使っているので、SequenceTypeでなければいけないこと。
if文で比較を行っているので、Equatableでなければいけないことを説明します。
まとめ
もっとより深く学びたい場合は、「A Swift Tour」の次にある「Language Guide」から学びたい項目を選択することで学ぶことができます。
流して見るだけでも、こういう記述方法があるのかと、勉強になるかと思います。
「A Swift Tour」とPlaygroundがあれば、手を動かしてSwiftの基礎を学ぶことができます。
これはどうなるかな?と思ったら、すぐにコードを修正し確認することができるので、Playgroundは便利です。
年末年始の連休で、2015年に向けてSwiftに触れてみてはいかがでしょうか。