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
今日はここまで。