(初心者向け)Xcode PlaygroundでSwiftの練習

XcodeのPlaygroundを使ってSwiftの練習をします
基本的に必要最小限なことしか書いていない（書けていない）ので、各項目についてより詳細に理解したい場合には、それぞれウェブ検索して他の入門編やハンズオン資料などを参照ください

#1. Playgroundを起動します
- Xcode起動時にPlaygroundを選択します

<img width="483" alt="スクリーンショット 2017-10-03 10.21.34.png" src="https://qiita-image-store.s3.amazonaws.com/0/125842/42a48b7d-8788-3e80-3e25-870b4c3e7370.png">

- `Blank`のplaygroundを指定します

<img width="727" alt="スクリーンショット 2017-10-03 10.24.13.png" src="https://qiita-image-store.s3.amazonaws.com/0/125842/4dd547fb-f0f6-7736-a5a2-df8f6a98b934.png">

- 保存先として適当なフォルダーを指定します
- 以前にplaygroundを使用した事がある場合、「Replace？」（置き換え）と聞かれるので、置き換えて構わなければそのままreplaceします

<img width="415" alt="スクリーンショット 2017-10-03 10.51.17.png" src="https://qiita-image-store.s3.amazonaws.com/0/125842/22004661-c23e-799e-65b7-256450fdc7d4.png">



#2. Playgroundについて
- 書いたコードがそのまま実行されます
- 画面の右側に変数などの値が表示されます
- 画面の下部に実行結果が表示されます
- デフォルトで表示されている画面に、下記の一行を追加してみます

```
print(str)

```
- 実行結果を確認します

<img width="958" alt="スクリーンショット 2017-10-03 10.28.59.png" src="https://qiita-image-store.s3.amazonaws.com/0/125842/c841e7e9-4855-f1a8-7ff2-cdb35c6e1a41.png">




#3. 変数と定数
- こういう話題から入るのはなんだかコンサバなプログラミング教室っぽくて気が進みませんが、まあ仕方ないので。
- Swiftも他のプログラミング言語と同様に変数と定数があります
- 変数は`var`（変数：variable）で、定数は`let`で定義します

###3.1 変数
- playgroundに下記を書いて実行結果を確認してみます

```

var hensu = "abc"
print(hensu)
hensu = "def"
print(hensu)

```
<img width="532" alt="スクリーンショット 2017-10-03 10.32.35.png" src="https://qiita-image-store.s3.amazonaws.com/0/125842/48f5f0f7-6c39-0e31-c68b-ce8762acd3de.png">

- １行めの`var hensu`は変数hensuが初めて使われるので新たに定義しています。値として文字列"abc"を代入しています。`=`は算数の「等しい」ではなく、`=`の右側の値を`=`の左側へ代入する、という意味です。ここでは文字列"abc"を変数hensuへ代入しています。文字列はダブルクォーテーション"”で囲みます
- ３行めの`hensu = "def"`はすでに使用されている変数hensuへ新たに文字列"def"を代入（上書き）しています
- print文で上書きされた内容が出力されていることを確認します

**練習：**　新たな変数を用意し、好きな文字列で初期化してprintしてみます。そのあと、別の文字列で上書きしてprintしてみましょう

###3.2 定数
- playgroundに下記を書いて実行結果を確認してみます

```

let teisu = "abc"
print(teisu)
teisu = "def"
print(teisu)

```

- ３行めでエラーになってしまって実行できません
<img width="547" alt="スクリーンショット 2017-10-03 10.36.56.png" src="https://qiita-image-store.s3.amazonaws.com/0/125842/9e07c776-42a7-b0ca-935d-79f5c2b6bc57.png">

- １行めで定義した定数teisuに初期値として"abc"（でもなんでもけっこうですが）を指定したので、この定数の値はこのあとは変更不可能です
- 三行めでこの定数の値を変更しようとしているのでエラーになっています
- デバッグ欄（下欄）のnoteで`let`を`var`に変えれば変更可能（mutable)になるよ、と教えてくれています

```
change 'let' to 'var' to make it mutable
let teisu = "pqr"
^~~
var
```

**練習：**　新たに変数と定数を用意し、好きな文字列や値で初期化してprintしてみましょう



#4. 変数の型
- これもなんだかレガシーなプログラミング教室の話題みたいで気が引けますが、まあ仕方ないので。
- 変数には型というものがあって、文字列を扱うString型(文字列は英語でstring)、整数を扱うInt型（整数は英語でinteger)、ほかに小数点付きの数値を扱うFloatやDouble型（浮動小数点は英語でfloating point、倍精度浮動小数点の倍精度は英語でdouble precision）などがあります
- 文字列はダブルクォーテーションで（””）で囲みます
- playgroundに下記を書いて実行結果を確認してみます

```
let seisu = 1
let shosu = 1.2
let mojiretsu = "こんにちは"
print(seisu)
print(shosu)
print(mojiretsu)

```
<img width="380" alt="スクリーンショット 2017-10-03 10.58.35.png" src="https://qiita-image-store.s3.amazonaws.com/0/125842/a82e7252-ea1f-1902-8bc3-7bc23e954cd1.png">

- まあ、うまくいきますね。
- 上記では、特に「型」について宣言していませんが、Swiftが定数seisuはInt型、定数shosuはDouble型、定数mojiretsuはString型、と判断してくれています

- playgroundに下記を書いて実行結果を確認してみます

```
let seisu = 1
let shosu = 1.2
let mojiretsu = "こんにちは"
print(seisu+shosu)
print(seisu+mojiretsu)

```
<img width="637" alt="スクリーンショット 2017-10-03 11.02.03.png" src="https://qiita-image-store.s3.amazonaws.com/0/125842/83dd1feb-89ff-4a49-c9a2-8ef06c589e45.png">

- ４行めと５行めでエラーになりますね。型の合わない定数同士を加算しようとしてもエラーになります

- 暗黙的にSwiftに判断させるのではなく、変数・定数の定義の際に明示的に型を宣言することもできます

- 暗黙的にSwiftに判断させても、まぁ、良いのですが、うっかりすると書いている人が勘違いしている可能性もあるので、「この型で使うつもり」と明示的に宣言しつつ定義して使っていくほうが、　のちのちSwiftからエラーと言われてプログラマーが悩んでしまう事態を早期に防止できる可能性があります
- playgroundに下記を書いて実行結果を確認してみます

```
var a:String
var b:String
a = "ごきげん"
b = "いかが？"
print(a+b)

```

<img width="310" alt="スクリーンショット 2017-10-03 11.11.27.png" src="https://qiita-image-store.s3.amazonaws.com/0/125842/34e50b3c-0799-3928-47f5-905dccab8867.png">

- 型の異なる変数へ代入しようとしてもエラーになります

```
var suchi:Int
suchi = 1
suchi = "こんにちは"
```
<img width="652" alt="スクリーンショット 2017-10-04 8.44.56.png" src="https://qiita-image-store.s3.amazonaws.com/0/125842/3dc1bf51-cb7b-ac10-89ee-a628b9b7facd.png">

- 整数型として定義された変数suchiへ、１つめの数値１の代入は問題なくできていますが、２つめの文字列「こんにちは」の代入はエラーになっていますね。デバッグ欄（下欄）でその点について指摘されています

- 他にも、真(true)・偽(false)のどちらかの値をとるBool型があります

**練習：** 文字列型の変数を明示的に型を指定して用意し、好きな文字列で初期化してprintしてみます。同様に整数型の変数を明示的に型を指定して用意し、好きな値で初期化してprintしてみます




#5. 演算
- 足し算をしてみます
- playgroundに下記を書いて実行結果を確認してみます

```
let one = 1
let two = 2
print(one+two)

```
<img width="490" alt="スクリーンショット 2017-10-03 10.45.18.png" src="https://qiita-image-store.s3.amazonaws.com/0/125842/0c0270ec-3a3b-e9f5-ad1d-d77602a6be61.png">

- ここでは、Swiftが定数one、twoとも整数（INT)型と判断してくれています
- 整数同士の加算なのでその結果が正しく表示されています

```
let saisho = "おはよう"
let tsugi  = "ございます"
print(saisho+tsugi)
```

<img width="575" alt="スクリーンショット 2017-10-03 10.46.16.png" src="https://qiita-image-store.s3.amazonaws.com/0/125842/598bc96c-5cf5-d564-7ea8-b47ba29b1fc1.png">

- ここでは定数saisho、tsugiは文字列（STRING）型と判断されています
- 文字列型同士の加算は文字列の連結になりますね

- 四則演算の他の演算子もためしてみます
- ちなみにSwiftでは変数名に日本語も使えます、が、プログラミングのプラクティス（習慣）としてまあ止めておいた方が良いでしょう

<img width="596" alt="スクリーンショット 2017-10-03 10.49.02.png" src="https://qiita-image-store.s3.amazonaws.com/0/125842/a98dbb83-4377-2f10-5551-5cf61de7cfc9.png">

- もう少し演算の書き方について練習してみます（初心者向けです）

```
var a:Int = 0
print(a)
a = a + 1
print(a)
```
<img width="261" alt="スクリーンショット 2017-10-04 8.54.14.png" src="https://qiita-image-store.s3.amazonaws.com/0/125842/48bbffc8-b993-569c-038b-127c6ad207a9.png">

- １行めで整数型変数aを定義し初期値として0をセットしています
- ３行目に注目します

```
a = a + 1
```

- 数学的には意味不明ですが、Swiftを含めプログラムでは「＝」は「等しい」ではなく、「右辺のものを左辺へ代入する」なので、この行は「左辺のa+1を、右辺のaへ代入する」となり、つまりaに+1加算する、という処理になります

- 割り算をしてみます

```
var a:Int = 10, b:Int = 3
print(a/b)
var c:Float = 10, d:Float = 3
print(c/d)
var e:Double = 10, f:Double = 3
print(e/f)
```
<img width="407" alt="スクリーンショット 2017-10-04 9.14.34.png" src="https://qiita-image-store.s3.amazonaws.com/0/125842/89f44429-0ed9-8e3c-811e-e580cbed1893.png">

- 使用する変数の精度に準じて計算結果が表示されていることを確認します
- １つめのIntは整数型なので、１０ ÷　３ は３（小数点以下は切り捨て）になります
- 剰余演算（モジュロ、％）をやってみます

```
var a:Int = 10, b:Int = 3
print(a%b)
```
<img width="301" alt="スクリーンショット 2017-10-04 9.17.48.png" src="https://qiita-image-store.s3.amazonaws.com/0/125842/32e48669-c33f-cce2-f250-dae026b9fc56.png">

- 整数型変数１０を整数型変数３で剰余算した答え（整数１０を整数３で割った余り）は１ですね
- 剰余演算はプログラムの中で分岐の判断に用いられるなど、ちょっと便利に使われていたりします


**練習：**円周率を算出する（不正確ですが）例として２２を７で割る演算を、整数での割り算、浮動小数点（Float）での割り算、倍精度浮動小数点（Double）での割り算、またついでに剰余演算（モジュロ）をやって結果をprintしてみましょう




#6.比較演算子
- 値を比較する際に用います
- > < などは自明と思いますので省略
- 「等しい」を判定するのに「==」を用います（数学の「＝」だけだと代入になってしまうので）
- playgroundに下記を書いて実行結果を確認してみます。

```
let a:Int = 1
print( a > 2 )
```

<img width="258" alt="スクリーンショット 2017-10-04 12.26.19.png" src="https://qiita-image-store.s3.amazonaws.com/0/125842/f074cb92-8d7e-d9ce-79ef-d37fb5add80e.png">

- 整数型定数aは１で初期化されているので、print文の「a > 2」は偽（間違っている）になり、"false"と出力されています
- aが１と等しい（aが１かどうか）を判定したい場合、下記のように書きます（※厳密には「等しいかどうか」を判定する場合には対象の精度が問題になる場合があるので、プログラミング的には「等しい」かどうかの判定の使用は注意するようにします）

```
let a:Int = 1
print( a == 1 )
```

<img width="245" alt="スクリーンショット 2017-10-04 12.29.10.png" src="https://qiita-image-store.s3.amazonaws.com/0/125842/1e4d5963-28d4-4c75-94db-b7daf29cd14c.png">

**練習：** 整数型定数aを準備し初期値として１０をセットし、その値が10以上か、10以下か、１０未満か、について正しく判定して出力するように確認します






#7. 条件分岐
- いきなり、条件分岐の話ですが、まあよく使うので。
- 基本的な構文は下記のようになります

```
if 条件 {
　　　　　（条件に合っていれば実行される）
} else {
　　　　　（条件に合っていれば実行される）
}
```

- playgroundに下記を書いて実行結果を確認してみます。１行めのprint文のように、セミコロン（;）で接続して文をつなげることができます

```
var a = 1;print("aに1を代入")
if ( a > 0 ) {
    print("aは正の数です")
} else {
    print("aはゼロまたは負の数です")
}
```

<img width="544" alt="スクリーンショット 2017-10-03 11.25.25.png" src="https://qiita-image-store.s3.amazonaws.com/0/125842/73fc7bd9-4262-e694-7d41-0686fdfb2399.png">

- aは1なので、if文の`a > 0`の条件に合致するので、{}内のprint文が実行されています
- 同じif-then文を使って、途中でaの値を変更してみます

```
var a = 1;print("aに1を代入")
if ( a > 0 ) {
    print("aは正の数です")
} else {
    print("aはゼロまたは負の数です")
}
a = -1;print("aに-1を代入")
if ( a > 0 ) {
    print("aは正の数です")
} else {
    print("aはゼロまたは負の数です")
}
```

<img width="602" alt="スクリーンショット 2017-10-03 11.29.04.png" src="https://qiita-image-store.s3.amazonaws.com/0/125842/0f447eb7-8db5-f88f-b57f-2db6ce04a66c.png">

- 途中でaに-1を代入したので、今度はif文の`a > 0`の条件に合致しないので、else節のprint文が実行されています
- ちなみに、thenのあとにすぐifを続けて複数の条件での判定を続けることもできます

```
var a = 0;print("aに0を代入")
if ( a > 0 ) {
    print("aは正の数です")
} else if ( a < 0 ) {
    print("aは負の数です")
} else {
    print("aはゼロです")
}
```

<img width="382" alt="スクリーンショット 2017-10-03 11.33.40.png" src="https://qiita-image-store.s3.amazonaws.com/0/125842/76be826e-d46c-0920-b156-52637eca541b.png">

**練習：** 整数の変数を用意し、その値が１００を超えているか、１００以下かを判定して出力するif-then文を書いてみましょう。初期化の際に与える初期値を変化させて挙動の違いを確認します

- switch文でも条件分岐を記述できます

```
switch 条件 {
    case 値:
　　　　　（条件に合っていれば実行される）
    case 値:
　　　　　（条件に合っていれば実行される）
     default:
　　　　　（条件に合ったものがないときに実行される）
}
```

- playgroundに下記を書いて実行結果を確認してみます。整数型変数aの初期値を色々変えて確認します

```
var a:Int = 2
switch a {
    case 0:
        print("ゼロ")
    case 1:
        print("イチ")
    default:
        print("上記以外")
}
```
<img width="339" alt="スクリーンショット 2017-10-04 11.45.40.png" src="https://qiita-image-store.s3.amazonaws.com/0/125842/0701dc23-06b6-8c51-35d2-e1350b5583f4.png">

- switch文は文字列でもcaseを記述可能です

```
var a:String = "こんにちは"
switch a {
    case "おはよう":
        print("朝の挨拶")
    case "こんにちは":
        print("日中の挨拶")
    default:
        print("それ以外の挨拶")
}

```
<img width="349" alt="スクリーンショット 2017-10-04 11.48.30.png" src="https://qiita-image-store.s3.amazonaws.com/0/125842/50efe78c-e38c-b773-db45-247586a28feb.png">


**練習：** Bool型変数を用意し、初期値によって「真です」「偽です」を出力するswitch文を書いてみます。defaultを用意するとXcodeは何と言うでしょうか？



#８. 繰り返し処理
- いきなりループですか。まあそういうものなので。
- 繰り返し処理をfor-inループで記述できます。
- 基本的な構文は下記のようになります

```
for ループ変数 in 条件 {
繰り返し行わせたい処理
}
```

- playgroundに下記を書いて実行結果を確認してみます

```
for i in 1...5 {
    print("\(i)回め")
}

```
<img width="344" alt="スクリーンショット 2017-10-03 11.41.43.png" src="https://qiita-image-store.s3.amazonaws.com/0/125842/a2881723-7ea8-9ed8-39f2-521f968c4561.png">

**練習：**１から１０まで加算するプログラムを書いてみましょう。結果が正しく５５と表示されることを確認します（１００までであれば５０５０になります）


- whileでも繰り返し処理を記述できます
- playgroundに下記を書いて実行結果を確認してみます

```
var a:Int = 1
while a < 5 {
    print("\(a)回め")
    a = a + 1
}

```
<img width="320" alt="スクリーンショット 2017-10-04 12.04.36.png" src="https://qiita-image-store.s3.amazonaws.com/0/125842/f053541a-ee03-b7e8-2fb9-205ad10301d0.png">

-　整数型変数aに初期値として１をセットしています
-　aが５未満の間、while文で記述された処理を繰り返します
- 終了判定が行われるタイミングに注意します。a=4でprint文が実行されたあと、aに１が加算され、whileループの先頭に戻って条件を判断するとa < 5が成り立たなくなっているのでwhileループから抜けます。そのため、最後のprint出力は「４回め」となっています

**練習：** while文を使って１から１０まで加算するループを書いてみましょう




#９. 配列
-　今ごろになって配列ですか、と思われるかもしれませんが、まあそういうものかと。
-　同じような値が複数あってまとめて扱いたいという場合には配列を使います。箱に複数の値が並べて入っているイメージです
-　配列は要素を[]で囲みます
- playgroundに下記を書いて実行結果を確認してみます

```
var shiki = ["春","夏","秋","冬"]
print(shiki)
```

<img width="420" alt="スクリーンショット 2017-10-03 11.46.47.png" src="https://qiita-image-store.s3.amazonaws.com/0/125842/e27074bb-a565-5cff-36ff-5c96dd10b4b5.png">


- 配列の要素は添え字[n]を指定して扱うことができます

```
var shiki = ["春","夏","秋","冬"]
print(shiki)
print(shiki[0])
print(shiki[3])
```

<img width="420" alt="スクリーンショット 2017-10-03 11.49.28.png" src="https://qiita-image-store.s3.amazonaws.com/0/125842/57e29ee2-d136-27ba-9c5b-b328a766684e.png">

- 添え字は0から始まるので注意が必要です。わかりにくいかもしれませんが、コンピューターの世界では０から始まるのが普通なので。まあ、そういうものなので。
- 配列の初期化の際に、配列に格納されるデータの型を指定することが可能です。そのほうが後々のエラーを防ぐことができるのでは、という意図です。

```
var shiki:[String] = ["春","夏","秋","冬"]
print(shiki[2])
```
<img width="451" alt="スクリーンショット 2017-10-03 11.52.39.png" src="https://qiita-image-store.s3.amazonaws.com/0/125842/846acbcd-f833-5bdd-fdf2-a04e973c16a6.png">

- 変数(var)として定義されている配列であれば、添え字を指定して内容を書き換えることも可能です。まあ、変数なので、当然ですけど。

```
var shiki:[String] = ["春","夏","秋","冬"]
shiki[3] = "お正月"
print(shiki)
```

<img width="481" alt="スクリーンショット 2017-10-03 11.53.38.png" src="https://qiita-image-store.s3.amazonaws.com/0/125842/287aa446-7ae0-c08e-e18f-e5ddaaa81f44.png">

**練習１：** 日曜から土曜を格納する配列を用意し順に出力するプログラムを書いてみましょう。
**練習２：** １から１０までの値を格納する配列を用意し、その配列の要素を順に加算して和（５５）を求めるプログラムを書いてみましょう。
ヒント：ループの条件判断に配列名を用いることで要素数でループの終了条件を判断することができます
**練習３：** 同じ１から１０までの配列で、偶数だけを加算して和（３０）を求めるプログラムを書いてみましょう。
ヒント：配列、for-in文、if-then文を使うとできます（他の方法でも書けますけど）


#１０. 関数
- ちょっといろいろ呼び出したり便利なので。
- 基本的な使い方は


```
func 関数名(パラメータ名:パラメータの型) -> 返り値の型 {
    処理ー
}

関数名(パラメータ名:渡す値)

```

- Swift3.0以降、関数呼び出し時に渡すパラメータの型を指定する（エラーを防ぐため）ようになりました
- playgroundに下記を書いて実行結果を確認してみます

```
func kansu(input:String) -> Void {
    print(input)
}
var data = "こんにちは"
kansu(input:data)
```

<img width="524" alt="スクリーンショット 2017-10-03 12.17.03.png" src="https://qiita-image-store.s3.amazonaws.com/0/125842/7f96203a-8a64-feb6-10fc-c7740ab461b6.png">