Control Flow

Xcode 6.0 Beta

Swift学習中。

The Swift Programming Language.epubのA Swift Tour内のControl Flowの項を読んだ。

【条件文】
・if
・switch

【繰り返し】
・for-in
・for
・while
・do-while


条件式を含む括弧 ( ) は省略可能。
実行コードを含む括弧 {} は省略不可。

let individualScores = [75, 43, 103, 87, 12]
var teamScore = 0
for score in individualScores {
    if score > 50 {
        teamScore += 3
    } else {
        teamScore += 1
    }
}

if文の条件式はBooleanでなければならない。上記コードの if score > 50 { ... } の部分を if score { ... } と書いた場合はエラーになる。整数値を暗黙で0と比較するようなことは行われない。

Optional型の値がnilでないことを条件として、その内包している値を一時的に定数として取得し、条件ブロックを実行することもできる。

var optionalName: String? = "John Appleseed"
var greeting = "Hello!"

// optinalNameがnilでない場合にif内のコードが実行される
if let name = optionalName {
    greeting = "Hello, \(name)"
}

Optional型の値がnilの場合、条件文はfalseとなり、コードブロックはスキップされる。


switch文は整数型、同値比較のみならず、あらゆるデータ型を受け取ることができ、多様な比較操作をサポートする。case句で、同値比較以外の比較を行うには、

case let x where x < 10:

のようにして、letとwhereを使った構文を使う。

let vegetable = "red pepper"

switch vegetable {
    case "celery":
        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 vegetableComment = "Is it a spicy \(x)?"

    default:
        let vegetableComment = "Everything tastes good in soup."
}

switch文は網羅的でなければならず、すべての値をcaseで処理しない(できない)場合は、defaultを省略することはできない。また、case句の実行が終わると、自動的にswitch文を抜けるので、breakを明示的に書く必要はない。唐辛子はもちろん野菜である。アメリカではピザですら野菜とされている。


for-inでは、ループごとに、ディクショナリのキーと値を一時変数に取得することができる。これはObjective-C時代にはなかった機能であり、なかなかありがたい。

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
        }
    }
}


while, do-whileは普通。括弧 ( ), { } の不要、必須を除けば、Cと変わらない。

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


インデックスを保持したfor文も作成できる。
「min .. max」と指定した場合、インデックスはminから始まり、maxに達すると、ブロックを実行せずに抜ける。(minを含み、maxを含まない)
「min ... max」と指定した場合、インデックスはminから始まり、maxに達すると、ブロックを実行してから抜ける。(minを含み、maxも含む)

以下の2つのループ内容は同じ。

var firstForLoop = 0
for i in 0..3 {
    firstForLoop += i
}
firstForLoop
           
var secondForLoop = 0
for var i = 0; i < 3; ++i {
    secondForLoop += 1
}
secondForLoop


今日はここまで。