WonderPlanet DEVELOPER BLOG

ワンダープラネットの開発者ブログです。モバイルゲーム開発情報を発信。

「A Swift Tour」を巡りSwiftの基礎を学ぼう!

今回のエンジニアブログを担当する村田です。

Swiftの勉強会を開催し、Swift未経験者にワークショップを開くことがあります。
使用する教材はApple公式ドキュメント「A Swift Tour」。
「A Swift Tour」とXcodeを使い、参加者のみなさんにSwiftの基礎を学んでいただいてます。

今回はみなさんと「A Swift Tour」を巡る際に、追加で説明している点などをまとめたいと思います。

前準備:Playground

「A Swift Tour」を巡る際は、Xcodeを使ってサンプルプログラムをコーディングします。
通常のプロジェクトを用いて、コーディング⇔ビルドを行ったり来たりしていては、時間が掛かってしまい不便です。

Xcode 6からは「Playground」というものが用意されております。
コーディングした内容がすぐ実行され、結果が表示されるので、学習するのにとても便利です。

Playgroundの作り方は二通りあります。

  1. Xcode起動後の「Get started with a playground」を選択
    スクリーンショット_2014-12-11_20_58_45
  2. メニューから、[File] - [New] - [Playground...]を選択
    スクリーンショット 2014-12-11 21.01.20

 
 
Playgroundの生成に成功すると、以下のような画面が表示されます。
スクリーンショット_2014-12-11_21_04_43
画面右側で、変数の中身(値)をすぐに確認できるのがポイントです。

「A Swift Tour」の巡り方

基本的には、『上から読んでいき、記載されているソースコードをPlayground上で実行する!』です。
「A Swift Tour」は英語しかありませんが、ソースコードがありますし、
書いてある内容をそのままPlaygroundに打ち込むとすぐに結果が分かるので、そこまで困ることはありません。

「EXPERIMENT」欄は、「試してみよう!」といった内容です。
記載されているソースコードを打ち込むだけなく「EXPERIMENT」を実践することで、よりSwiftへの理解が深まります。

それでは、各章で補足している内容を記載します。

println文

「A Swift Tour」は

println("Hello, playground")  

で、はじまります。

Playgroundに打ち込むと、このようになります。
スクリーンショット 2014-12-11 21.28.56

printlnなので、標準出力画面が欲しくなります。
どのようにすれば、標準出力が表示されるのかと言いますと、
スクリーンショット_2014-12-11_21_31_31

成功すると、このようになります。
スクリーンショット_2014-12-11_21_37_31

「Console Output」がprintlnの出力先になります。
printlnを使って挙動を細かく確認したい場合は、「Console Output」を出しておくことをオススメします。

ただ、この新たなビューが右側に出ることでエディター領域が狭まり、邪魔な場合があります。
このビューの表示位置を変更したい場合は、メニューの[View] - [Assistant Editor]から好きな配置を選びましょう。
スクリーンショット 2014-12-11 21.43.45

Simple Values

この章は、変数・定数や、array・dictionaryなので、処理としては複雑なことはありません。

一番聞かれるのが、バックスラッシュ(\)の入力方法です。
英字キーボードの場合は、バックスラッシュキーがあるので迷いませんが、JISキーボードの場合は迷います。
JISキーボードの場合は、『optionキーを押しながら、¥キーを押す』と入力できます。

あと追加で説明しているのは、実用性はありませんが、こちらです。
スクリーンショット 2014-12-11 21.51.08
変数やfunc名に使える文字がUnicodeとなっているので、日本語や絵文字が使える点です。
日本語の変数を見ると、昔のVisual Basicを思い出します...

Control Flow

まず最初のfor文をPlaygroundで実行すると聞かれるのが、下図の赤枠の部分です。
スクリーンショット_2014-12-11_21_55_07
Playgroundでは、制御文のどこを何回通過したのか表示されます。

ただし、次のように通過回数が一回の場合は、回数ではなく実行結果が表示されます。ここも聞かれるポイントです。
スクリーンショット_2014-12-11_21_56_25

あと、追加で説明しているのが、特定の条件を除き switch文にはdefaultが必須であることです。
実際にdefaultを削除していただき、結果がどうなるのか確認します。

Functions and Closures

まずは、2つ目の例でタプルが出てくるところです。
タプルは、複数のオブジェクトをまとめて扱えるもので、インデックスかラベルを付けている場合はラベル名でアクセス可能です。
ここでは、ラベルを取ると挙動がどうなるか、を試します。
色々触っていただくことで、タプルがどんなものなのかを理解していただきます。
スクリーンショット_2014-12-11_22_22_06

あとは、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に触れてみてはいかがでしょうか。