おおまかなコントロールフロー

if
for-in
whileとdo while
switch
制御転送命令

if

みんなだいすきif文。

let orangesAreOrange = true
let turnipsAreDelicious = false

if turnipsAreDelicious {
	println("Mmm, tasty turnips!")
} else {
	println("Eww, turnips are horrible.")
}

このようにtrueかfalseのくるものを条件の所に入れて使えばOK。
ただし、Swiftのif文の条件文のところにはブール(あとはnilくらい?)しか来ることが出来ないので注意。どこぞの言語みたいに0はfalseでそれ以外trueみたいなInt型の処理はない。エラー。エラーだよ。

let i = 1
if i {	//Intが来ているためエラー
}

if i == 1{	//trueかfalseが来るのでOK
}

for-in

いわゆるforeach的なfor文のご紹介。

let individualScores = [75, 43, 103, 87,12]
var teamScore = 0

for score in individualScores {
	if score > 50 {
		teamScore += 3
	} else {
		teamScore += 1
	}
}
teamScore	//11くらいかな?

for 適当な名前 in 配列名、てな感じで配列の要素を適当な名前でいじっていくというヤツ。よく見るような使い方だ。

Dictionaryのキーやら値やらを使うfor-in文はこんな感じ。

let interestingNumbers = [
	"Prime": [2, 3, 5, 7, 11, 13],
	"Fibonacci": [1, 1, 2, 3, 5, 8],
	"Square": [1, 4, 9, 16, 25],
]
var largest = 0
for (kind, numbers) in interestingNumbers {
	for number in numbers{
		if number > largest {
			largest = number
		}
	}
}
largest	//25

for (適当なキー, 適当な値) in Dictionary名、って感じ。ここではさらにnumbers(PrimeとかFibonacciとかSquareの配列を指すことになる)に対してfor-in文を使っている。

whileとdo while

たぶんどうってことない。

var n = 2
while n < 100 {
	n = n * 2
}
n

var m = 2
do {
	m = m * 2
} while m < 100
m

switch

switch文はbreakが不要(基本的に1つのcaseしか実行されない)なのとdefaultが必須であることに注意。defaultないとエラー吐かれる。

let vegetable = "red pepper"
switch vegetable {
case "celery":
	//1つだけ
	let vegetableComment = "Add some raisins and make ants on a log."
case "cucumber", "watercress":
	//複数
	let vegetableComment = "That would make a good tea sandwich."
case let x where x.hasSuffix("pepper"):
	//let 適当 where に続けて条件文を書くことが可能。ここでは(vegetableに)pepperを含むかどうか
	let vegetableComment = "Is it a spicy \(x)?"
default:
	let vegetableComment = "Everything tastes good in soup."
}

制御転送命令

なんかすごい訳だが原文はcontroll transfer statementsでいわゆるcontinueとかbreakとか。この辺はまあおなじみ。
まずはcontinueをば。

let puzzleInput "great minds think alike"
var puzzleOutput = ""
for character in puzzleInput {
	switch character {
	case "a", "e", "i", "o", "u", " ":
		continue
	default:
		puzzleOutput += character
	}
}
//grtmndsthnklk
println(puzzleOutput)

母音が来たら(他には何もせず)次のforループ周回に入ってくれといったところ。
ちなみに、前項の通りbreakが不要であるので、case~の中にはbreakは書かれていない。別にbreakがなくても母音に対してはdefaultにある処理はなされない。しかし、やることがない・breakを書く必要がないからといってcase~の中に何も書かないとエラーになるので注意。そのためこの位置にcontinueがある。詳細はswitchの詳細のところで。

次にbreak。swiftにおけるswitch文の仕様のせいで出番がなくなるのではないか……という気がするが出番がないわけでもないようだ。
次の例ではdefault内でbreakを使用している。どのcaseにも当てはまらない奴は何もしないで終わってくれ、と言いたいのがこの例におけるswitchなのだが、何もしないからといって何も命令を書かないとエラーになるのがswiftなので、「ただちにswitchを終わってくれ」という命令を置くことでその問題を解決している。

let numberSymbol: Character = "三"
var possibleIntegerValue: Int?	//defaultに来ちゃってnilの可能性があるのでInt?型。

switch numberSymbol {
case "1", "一":
	possibleIntegerValue = 1
case "2", "二":
	possibleIntegerValue = 2
case "3", "三":
	possibleIntegerValue = 3
case "4", "四":
	possibleIntegerValue = 4
default:
	break
}
//The integer value of 三 is 3.
if let integerValue = possibleIntegerValue {
	println("The integer value of \(numberSymbol) is \(integerValue).")
} else {
	println("An integer value could not be found for \(numberSymbol).")
}

制御ナントカにはfallthroughもあるけど、そっちはswitchで。

最後にラベルをば。挙動としてはjavaとかといっしょっぽい。forとかwhileとかの前に「ラベル:」とつけて使う。
で、残念ながらこのマニュアルに載っている例が「梯子とヘビがいるすごろく」ゲームで説明が面倒臭いので、このサイトさんのjavaのラベルの例をswift風に書くことにする。ごめんちゃい。
Javaの学習ならJavaDrive

まずはbreak+ラベル。指定のループを脱出するときにどうぞ。
次の例は、どんどん掛け算を計算・表示していくがその結果が5を超えたらやめるといったもの。

outside: for i in 1..5 {
    for j in 1..5 {
        if i * j > 5 {
            break outside	//jのループではなく外側のiの方のループが終わる
        }
        println("\(i) * \(j) = \(i * j)")
    }
}
/*
1 * 1 = 1
1 * 2 = 2
1 * 3 = 3
1 * 4 = 4
2 * 1 = 2
2 * 2 = 4	//2 * 3 > 5なのでここで全ておわり。
*/

/*
ただのbreakだと次のようになる
1 * 1 = 1
1 * 2 = 2
1 * 3 = 3
1 * 4 = 4
2 * 1 = 2
2 * 2 = 4
3 * 1 = 3
4 * 1 = 4
*/

continue+ラベル版はこんな感じ。javaDriveさんの例だとcontinueでもcontinue outsideでも結果が変わらないので、ちょっとfor jの外に命令を1つ書いてみた。continue outsideならば、計算結果が5を越えた時点で次に行ってしまうのでその追加の命令は実行されない。

outside: for i in 1..5 {
	for j in 1..5 {
		if i * j > 5{
			continue outside
		} 
		println("\(i) * \(j) = \(i * j)")
	}
	println("continueされずに\(i)のやつを最後まで出力できたよ")
}
/*
1 * 1 = 1
1 * 2 = 2
1 * 3 = 3
1 * 4 = 4
continueされずに1のやつを最後まで出力できたよ
2 * 1 = 2
2 * 2 = 4	//2 * 3 > 5よりcontinueが発動しi = 3へ
3 * 1 = 3
4 * 1 = 4
*/

/*
ただのcontinueだとこんな感じ
1 * 1 = 1
1 * 2 = 2
1 * 3 = 3
1 * 4 = 4
continueされずに1のやつを最後まで出力できたよ
2 * 1 = 2
2 * 2 = 4
continueされずに2のやつを最後まで出力できたよ
3 * 1 = 3
continueされずに3のやつを最後まで出力できたよ
4 * 1 = 4
continueされずに4のやつを最後まで出力できたよ
*/

↑ PAGE TOP