【iPhoneアプリ開発入門】Swiftのif、switch、forなどの基礎文法
Swiftは他の言語と違って少々書き方が変わっていたりするので、他の言語の経験があると違和感を覚える方もいるかと思います。
JavaScriptに似ているような気もしますね。
セミコロン付けなくて良かったり、条件分岐などに()付けなくて良かったり・・・と。
Objective-Cよりは分かりやすいと思います…。
準備
テスト用プロジェクトを生成して、準備をします。
プロジェクトの作り方などは以下を参考にして作ってみてください!
【iPhoneアプリ開発入門】Xcode操作だけでHello, Worldを表示
基本文法
基本文法はプログラミングをする上で、沢山使っていきます。
1つ1つ理解をして、焦らず覚えていきましょう!
コンソール出力
1 2 3 |
[sourcecode lang="java"] print("ドーモ。Swift=サン。printです。") [/sourcecode] |
これはデバッグ等に使う事ができます。
ゲームで使うとするならば、
- プレイヤーやエネミーの座標
- 変数の中身
- 処理の通過
- その他
上記のようなものを確認するときによく使います。
また、コンソール出力のみでゲームを作る事も可能です。
(わざわざSwiftを使ってやることではありませんが・・・)
変数
1 2 3 |
[sourcecode lang="java"] var hoge = 10 [/sourcecode] |
変数は var を使って宣言します。
変数は値を上書きしたりすることが可能です。
また、varの型は自動で推測する機能が備わっています。
1 2 3 4 5 |
[sourcecode lang="java"] var hoge = 10 hoge = 20; print(hoge); [/sourcecode] |
上記を実行すると 20 が表示されます。
また、型を指定して宣言することもできます。
1 2 3 4 5 6 |
[sourcecode lang="java"] var hoge: Int = 1 // Int型 var piyo: String = "ほげほげ" // String型 var puyo: Float = 1.1 // Float型 var huga = 1.1 // この場合はFloatを指定していないので、型はDoubleと判断される [/sourcecode] |
定数
1 2 3 |
[sourcecode lang="java"] let hoge = 10 [/sourcecode] |
定数は変数と違って値を上書きすることはできません。
決まった値を格納しておくことによく使います。
1 2 3 4 |
[sourcecode lang="java"] let hoge = 10 hoge = 15 [/sourcecode] |
上記のようなことをするとエラーになります。
配列
1 2 3 |
[sourcecode lang="java"] var animals = ["doggy", "cat", "otter", "monky"] [/sourcecode] |
配列はブランケット(これ->[])を使用します。
ちなみに、空の配列も作れます。
1 2 3 |
[sourcecode lang="java"] var emptys = String[]() [/sourcecode] |
連想配列
1 2 3 4 5 6 7 8 9 |
[sourcecode lang="java"] var animals = [ "doggy" : "いぬ", "cat" : "ねこ", "otter" : "かわうそ", "monky" : "さる" ] print(animals["doggy"]) // 出力結果 : いぬ [/sourcecode] |
連想配列はこのようにして作れます。
また、空の連想配列も作れます。
1 2 3 |
[sourcecode lang="java"] var animals = Dictionary<String, String>() [/sourcecode] |
if文の条件分岐
1 2 3 4 5 6 7 8 9 |
[sourcecode lang="java"] if 条件式1 { // 条件1がtrueだったらここを通る } else if 条件2 { // 条件1がfalseで条件2がtrueだったらここを通る } else { // 条件1と条件2どちらともtrueじゃなかった場合はこちら } [/sourcecode] |
if文の条件はtBool型でなければいけません。
Int型や文字列型等はif文の条件として直接使用することはできないようです。
また、() をつけて宣言することも可能です。
1 2 3 4 |
[sourcecode lang="java"] if (条件式1) { } [/sourcecode] |
こちらの方が見慣れていて、気持ちがいいですね。
switch文の条件分岐
1 2 3 4 5 6 7 8 9 10 |
[sourcecode lang="java"] switch 比較対象 { case 値1: 値1の処理 case 値2: 値2の処理 default: 上のどの条件にも当てはまらない場合の処理 } [/sourcecode] |
他の言語をやったことがある方であれば「え?これ値1の時、全部のcase文を通らない?」となるかと思います。
Swiftでは、breakを書かなくてもちゃんとbreakの処理をしてくれているようです。
逆に、break無しの処理をしたい場合の書き方もあります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
[sourcecode lang="java"] var hoge = 1 switch hoge { case 1: print("アイエエエエ!") fallthrough case 2: print("ニンジャ!?") fallthrough case 3: print("ニンジャナンデ!?") fallthrough default: print("おわり") } // 出力結果 // アイエエエエ! // ニンジャ!? // ニンジャナンデ!? // おわり [/sourcecode] |
fallthrough を処理の中に入れることで、次のcase文に移ることが可能です。
多様すると、可読性が悪くなるのが難点ですね。
for文
1 2 3 4 5 6 7 8 9 10 11 |
[sourcecode lang="java"] // パターン1 for 初期化処理; ループの継続処理; ループの後処理 { // 処理 } // パターン2 for 要素 in 要素の取り出し元 { // 処理 } [/sourcecode] |
for分には書き方が2つあり、パターン1は他の言語でもよく使われているfor分です。
パターン2は他言語で言うforeachになります。使う場合はこの様にして使う事が出来ます。
1 2 3 4 5 6 7 8 9 10 11 |
[sourcecode lang="java"] let province = ["千葉", "滋賀", "佐賀"] for index in 0 ..< province.count { print(province[index]) } /* 実行結果 千葉 滋賀 佐賀 */ [/sourcecode] |
while文
1 2 3 4 5 6 7 8 9 10 11 |
[sourcecode lang="java"] // ループの最初に条件判定 while ループの継続条件 { // 処理 } // ループの最後に条件判定 do { // 処理 } ループの継続条件 [/sourcecode] |
while文には2つ書き方があります。条件を判定するタイミングが違うので、用途によって使い分けることになると思います。
個人的には ループの最初に条件判定 の方が使いやすく感じますね。
おまけ
上記の構文を使って、超簡単な自動で戦ってくれるRPGでも作ってみましょう!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 |
[sourcecode lang="java"] import UIKit var playerName = "ああああ" var playerHp = 3 var playerDamage = 1 var enemyName = "スライム" var enemyHp = 2 var enemyDamage = 1 var enemyMoney = 5 var enemyExp = 3 // 待つ時間 var waitTimer = 0 // 今の時間を格納 let WAIT_TIME = 60 * 25; // 待つ時間 while 0 < playerHp || 0 < enemyHp { // プレイヤーのターン print("[\(playerName)]は[\(enemyName)]に[\(playerDamage)]のダメージを与えた。") enemyHp -= playerDamage // エネミーのHPをプレイヤーのダメージ分減らす // RPGっぽく一定時間待つ while waitTimer < WAIT_TIME { waitTimer++; } waitTimer = 0; // エネミーを倒したか判定 if 0 > enemyHp { print("[\(playerName)]は[\(enemyName)]を倒した。") // RPGっぽく一定時間待つ while waitTimer < WAIT_TIME { waitTimer++; } waitTimer = 0; print("[\(playerName)]は[\(enemyExp)exp]と[\(enemyMoney)G]を手に入れた。") break; // while文から抜ける } // RPGっぽく一定時間待つ while waitTimer < WAIT_TIME { waitTimer++; } waitTimer = 0; // エネミーのターン print("[\(enemyName)]は[\(playerName)]に[\(enemyDamage)]のダメージを与えた。") playerHp -= enemyDamage // プレイヤーのHPをエネミーのダメージ分減らす // RPGっぽく一定時間待つ while waitTimer < WAIT_TIME { waitTimer++; } waitTimer = 0; // プレイヤーの負け判定 if 0 > playerHp { print("[\(playerName)]は死んでしまった・・・。") break; // while文から抜ける } else { // ステータス表示 print("\(playerName) HP : \(playerHp)") } // RPGっぽく一定時間待つ while waitTimer < WAIT_TIME { waitTimer++; } waitTimer = 0; } [/sourcecode] |
実行するとこんな感じになります。
今回紹介した内容から抜き出して作った超簡単RPGになります。
正直言うと、上記のソースコードは良くありません。
悪い部分としては、
・ランダム要素がないので、今だと絶対にプレイヤーが勝つ
・同じような処理を何度も書いている
・whileの中に処理を全部書いてしまっている
次回の章で、どこが悪いのか、というのがわかるかと思います。
記事をご閲覧して頂き、ありがとうございました!
またどこかでお会いしましょう…。
参考サイト
swift言語を学ぶ/制御構文