ProgateでSwiftを学ぶ【コース2は繰り返し、配列、辞書、オプショナル】

progateでswiftコース2

Progateはプログラミング学習サービスになります。前回のコース1ではSwiftの文字列、数値、変数、条件分岐などについて学びました。詳しくはこちらの記事をご覧ください。↓
ProgateでSwiftを学ぶ【コース1は文字列、数値、変数、条件分岐】

iPhoneアプリの開発はMacパソコンじゃないとできないのは涙目ですが、どういうものかというのをつかむだけでもやっていこうかと思います。それでは学習をすすめていきます。

複数の条件分岐

条件分岐についてはコース1でやった内容(上にリンクあり)をみてほしいのですが、複数の条件分岐は【 else if 】をつかいます。if文は〇〇だったらという意味になるのですが、else ifは〇〇だったらという条件を何個も宣言できるというわけですね。

let signalColor: String = "Yellow"
if(signalColor == "Red"){
    print("止まってください");
}else if(signalColor == "Yellow"){
    print("注意してください");
}else{
    print("進むことができます");
}

条件式についてですが、Swiftの場合は()かっこがなくても書くことができます。筆者はどちらかというと()を付けたい派なのでかっこをつけて書いております。

switch文

switch文は条件がたくさんあるときにつかいます。【 switch(値){} 】のようにしてswitch()に値を設定してそれをcase文で比較します。処理が終わらったらbreak文で終了する必要があるのでbreak文は必ず記述します。

let rank: Int = 2
switch(rank){
    case 1:
    print("金メダル");
    break;
    case 2:
    print("銀メダル");//〇
    break;
    case 3:
    print("銅メダル");
    break;
    default:
    print("メダルはありません");
    break;
}

定数rankの値は2になっていてそれをswitch文にセットします。定数rankは2なのでcase 2:の分と一致したことになり。case 2:の処理が適用される”銀メダル”が出力されます。

範囲

swift 範囲

swiftには範囲という概念があるみたいで【 … 】ピリオドを3つ並べると〇〇から〇〇での範囲を表現できるようです。
また【 ..< 】とすることによって<6だったら6が除外されるみたいなんですね。でこれピリオドの数に罠があるのでここは注意ですね除外するときはピリオドがひとつなくなっています。具体的な使用用途はswitchのcase文に使った例が↓です。

let score: Int = 75
switch(score){
    case 100:
    print(“満点合格です”)
    break;
    case 60…99:
    print(“合格です”)//〇これ
    break;
    default:
    print(“不合格です”)
    break;
}

配列

配列とはなにかという複数のデータを格納できる箱のようなものです。Swiftの配列は他の言語と少し宣言の仕方が違いますね。

配列の宣言は【let 配列名: [型] = [“値”, 値, 値] 】のようにします。[]かっこの中に数値や文字などをカンマ区切りで指定することで複数のデータをとりあつかうことができます。

let signalColors: [String] = ["赤", "黄", "青"];

配列へのアクセス

配列はインデックス番号というものが自動的にわりふられています。これは配列の先頭が0番からはじまるというルールがあります。配列へアクセスするには、配列名にこのインデックス番号を指定することで行います。

配列にアクセスする書き方は例えば先頭0番にアクセスしたいんだったら【 配列名[0] 】のようにします。

let signalColors: [String] = ["赤", "黄", "青"];
print(signalColors[1])
print(signalColors[0] + "のときは止まりましょう");

配列要素の更新

配列の要素を更新するには【 配列[インデックス番号] = 値 】のようにします。配列のアクセスするときと一緒でそこに値を代入することで配列要素の更新を行います。ちなみに配列を更新する場合は 【 配列名をvarで宣言しておく 】ようにしましょう。

var favoriteFoods: [String] = ["ピザ", "ステーキ", "ハンバーガー"]
print(favoriteFoods)//["ピザ", "ステーキ", "ハンバーガー"]
favoriteFoods[1] = "パスタ";
print(favoriteFoods)//["ピザ", "パスタ", "ハンバーガー"]

配列の末尾に要素を追加する

Swiftの配列の末尾に要素を追加するには【 append(“要素”) 】と書きますね↓

var favoriteFoods: [String] = ["ピザ", "ステーキ", "ハンバーガー"]
favoriteFoods.append("寿司");
print(favoriteFoods)////["ピザ", "ステーキ", "ハンバーガー", "寿司"]

繰り返し処理

for文

for文を使うと配列の要素をひとつひとつ取り出すことができます。
具体的な書き方は【 for 変数名 in 配列名{} 】のように書きます。変数名の部分配列から取り出した要素が入っています。この変数はその後の処理に使うことができます。配列の要素をすべて取り終わるまで処理されます。余談になりますがfor文に()かっこを使うとエラーになります。

let favoriteFoods: [String] = ["ピザ", "ステーキ", "ハンバーガー"]
for favoriteFood in favoriteFoods{
    print(favoriteFood + "は好きな食べ物です")
}
//ピザは好きな食べ物です
//ステーキは好きな食べ物です
//ハンバーガーはは好きな食べ物です

for文と範囲

for文に範囲を指定することによって〇〇回繰り返すというのが実現できます。
具体的には【 for 変数名 in 1…3 】のように回数を指定します。

for num in 1...3{
    print(num);//1 2 3
}

辞書

辞書はキーと値のペアがセットになって複数入っている箱のようなものですといってもピンとこない可能性が高いので構文をみてもらえればと思います。Swiftの辞書は【 キーと値の型指定 】を行う点に注意が必要です。

具体的には【 let 辞書名: [キーの型: 値の型] = [キー: 値, キー: 値] 】のように書きますが逆にめちゃくちゃわかりにくいですね。実際の構文を見てもらったほうが良いかと思います。【 値の更新ができるようにするには辞書をvarで定義します 】

let user: [String: String] = [
"name": "Suzuki",
"email": "suzuki@example.com"
]

辞書の値にアクセス

辞書の値にアクセスするには【 辞書名[“キー名”] 】のように書くと【 キーに対応した値 】が取り出されます

let user: [String: String] = [
"name": "Suzuki",
"email": "suzuki@example.com"
]
print(user["email"]);//Optional("suzuki@example.com")

辞書の値の更新

辞書の値の更新は【 辞書名[“キー名”] = 値 】のようにします。このとき辞書はvarで宣言しておきます。

var user: [String: String] = [
    "name": "Suzuki", 
    "email": "suzuki@example.com"
]
user["name"] = "Sato"
print(user["name"])//Optional("Sato")
user["hobby"] = "soccer"
print(user["hobby"])//Optional("soccer")

Optional()とnil

辞書の値にアクセスしようとする場合キーが存在していれば値はOptional()というものに入っているのですが、辞書に存在しないキーにアクセスしようとすると、nilを返します。

let user: [String: String] = [
    "name": "Suzuki", 
    "email": "suzuki@example.com"
]
print(user["name"]);//Optional("Suzuki")
print(user["password"]);//nil

Optional型のデータ

Optional型とはデータ型に【 let name: String? = nil 】?記号をつけることによってnilを代入できるようにしたものだそうです。
しかしOptinal型に通常の値を代入すると【 let name: String? = “tanaka” 】結果は
【 print(name)//Optional(“tanaka”) 】のようになりそのままでは使えないようになっているそうです。

swift Optional型
辞書の値にはnilがある可能性もあるのでオプショナル型の変数に入れるような慣習があるようです。

let user: [String: String] = [
    "name": "Suzuki", 
    "email": "suzuki@example.com"
]
let name: String? = user["name"];
print(name);//Optional("Suzuki")
let number: Int? = 5
print(number);//Optional(5)

nilであるかどうかをチェックする。Optional型をアンラップする

Optional型をアンラップとはなにかというと値にnilが含まれていないかチェックしたあとに【 Optional型から通常の型に変換 】することを言います。nilはバグの発生原因になるのでnilがないかチェックしたあとに通常の型に戻すわけですね。

先ほども書いたようにOptionalはそのままでは使えないのでアンラップする必要があります。
アンラップの書き方は【 オプショナルの値! 】とします。オプショナルの値に!マークをつけることで【 アンラップ 】を行います。といってもあまりピンとこない可能性が高いのでコードを見てもらったほうがよいかと思います。

let user: [String: String] = [
    "name": "Suzuki", 
    "email": "suzuki@example.com"
]
if(user["name"] != nil){
    let name: String = user["name"]!//アンラップ
    print(name);//Suzuki
}

オプショナルバインディング

オプショナルバインディングはnilのチェックとアンラップをひとまとめにできるようにした仕組みのようです。値がnilでなかった場合はアンラップされた値が定数にはいり、そのあとにif文の処理が実行されるようです。これは他のプログラミング言語にはない機能ですね。
swift オプショナルバインディング

let user: [String: String] = [
    "name": "Suzuki", 
    "email": "suzuki@example.com"
]
if let name: String = user["name"]{
    print("名前は\(name)です");
}
if let address: String = user["address"]{
    print("住所は\(address)です")
}

オプショナルバインディングとelse

オプショナルバインディングで値がnilだった場合はelse文が実行されるようですね

let user2: [String: String] = [
  "name": "tanaka",
  "age": "20"
]
if let address: String = user2["address"]{
    print("住所は\(address)です")
}else{
    print("住所は定義されていませんです");//〇これ
}

型推論

型推論は変数や定数の宣言のときにデータ型の宣言を省略できるやつですね。Progateによると通常の定数や変数のときは型宣言を省略せずオプショナルバインディングを使うときに型宣言を省略するとのことです。以下はオプショナルバインディングで型宣言を省略したものです。

let user: [String: Int] = [
    "age": 20, 
    "height": 181
]
if let age = user["age"]{
    print("年齢は\(String(age))歳です")//〇
}else{
    print("年齢は定義されていません")
}

辞書から英単語をしらべる

以下のコードはXcodeのボタンをクリックしたときのサンプルコードで入力した英単語があるかどうかオプショナルバインディングで調べているコードです。

@IBAction func buttonTapped(sender: AnyObject) {
        let dictionary: [String: String] = [
            "apple": "りんご",
            "banana": "ばなな",
            "grape": "ぶどう",
            "peach": "もも",
            "pear": "なし"
        ]
        let inputText: String = textField.text!;
        if let word = dictionary[inputText]{
            label.text = word;
        }else{
            label.text = "登録されていません";
        }
    }

Progate Swiftコース2まとめ

ProgateのSwiftコース2は結構覚えることが多くて大変でした。学んだ内容は複数条件分岐、繰り返し、配列、辞書、オプショナル型、アンラップ、オプショナルバインディングでした。オプショナルバインディングは難しいですがこれはこれで便利な気もします。あとは範囲とかも他の言語にはあまり見ない機能でしたね。

次の記事はProgateでSwiftを学ぶ【コース3は関数関係】 | 初心者のプログラミング