訂正:swiftの仕様変更に伴い、半閉区間の表記を..から..<に改めました(2014/7/9)。
制御構文
それでは次に、Swiftの制御構文を見ていきましょう。Objective-Cで使われていた「if」「for」「switch」などの制御構文の使い方が、Swiftでは微妙に変化しています。
if文
Swiftでは、ifの直後の括弧を省略できるようになりました。
let myage = 26
if myage >= 25 && myage <= 35 {
println("you are around thirty!")
}
if文には、オプショナル列挙型と組み合わせた構文もあります。これについては次回以降に解説します。
for文
コレクション型の説明でちらっと出てきた記法なのですが、Swiftでは「...」や「..<」を値の間に入れることで、区間を表すレンジを取得できます。例えば、Int型の数a、bに対しては、
a...b
で、aからbまでの末端a、bを含んだ閉区間を表すことができます。また、
a..<b
で、aからbまでの末端aを含み末端bを含まない半閉区間を表します。
これらのレンジを用いることでfor文を回す区間を簡単に指定できます。
var factorial = 1
let destInt = 10
for factor in 1...destInt {
factorial *= factor
}
factorial // 3628800
また、ifと同様、括弧が省略可能になっています。
コレクションArray、Dictionaryでは、for in文で要素に順にアクセスすることができます。
let sciences = ["math", "physics", "chemistry", "biology", "geology"]
var sciencesStr = ""
for science in sciences {
sciencesStr += science
sciencesStr += " "
}
sciencesStr // "math physics chemistry biology geology "
let capitals = ["japan" : "tokyo", "america" : "washington", "china" : "beijing"]
var capitalListStr = ""
for (country, capital) in capitals {
capitalListStr += "country : " + country + ", capital : " + capital + "\n"
}
capitalListStr
//country : america, capital : washington
//country : china, capital : beijing
//country : japan, capital : tokyo
Stringの変数では「+=」を使って、以前より簡単に末尾にStringを追加できるようになりました。
さらに、StringをCharacter型の配列とみなして、for in文により1文字ずつ処理を行うことも可能になりました。
for character in "Doge" {
println(character)
}
// D
// o
// g
// e
条件付きのfor文も、もちろん書くことができます。
for var num = 0; num < 3; ++num {
println("\(num) * 4 is \(num * 4)")
}
// 0 * 4 is 0
// 1 * 4 is 4
// 2 * 4 is 8
switch文
Swiftのswitch文では、caseの後にカンマを続けて打つことで、1つのcaseに複数の条件が含められるようになりました。また、各caseでbreakするために、明示的にbreakを書く必要がなくなりました。
var smallChar: Character = "r"
switch smallChar {
case "r", "R": println("smallChar is r or R")
default: println("smallChar is not r or R")
}
// smallChar is r or R
caseの後に何も文を書かないと、コンパイルエラーになります。
var bigChar: Character = "R"
switch bigChar {
case "r": //コンパイルエラー
case "R": println("bigChar is R")
default: println("bigChar is not r or R")
}
caseにInt型で条件を記述するとき、値の範囲を指定することもできます。
let population = 128_057_352
switch population {
case 0: println("zero")
case 1...99:
println("from one to one hundred")
case 100...9_999:
println("from hundred to ten thousands")
case 10_000...999_999:
println("from ten thousands to million")
case 1_000_000...999_999_999:
println("from million to one hundred million")
case 100_000_000...10_000_000_000:
println("from one hundred million to ten billion")
default:
println("minus or over ten billion")
}
// from one hundred million to ten billion
アンダースコア「_」は数値を表すリテラルの中で使用できます。リテラルの可読性を高めるためにしばしば用いられます。
また、caseでは条件判定を行う対象にタプルも使うことができます。タプルの要素はletで容易に取り出せます。さらに、letで取得した要素を使った条件をwhereに記述することで、より複雑な条件をcaseに設けることができます。case、let、whereを組み合わせた例を見てみましょう。
let point = (0.5, 0.7)
switch point {
case let (x, y) where x*x + y*y > 1:
println("(\(x), \(y)) is out of the unit circle")
case let (x, y) where x*x + y*y == 1:
println("(\(x), \(y)) is on the unit circle")
case let (x, y) where x*x + y*y < 1:
println("(\(x), \(y)) is in the unit circle")
case let (x, y):
println("other case")
}
//(0.5, 0.7) is in the unit circle
なお、対象となる値をcaseかdefaultで網羅的に調べ上げない場合、switch文はコンパイルエラーを起こすので注意してください。
他にも、caseを従来と同じように通過させ、次のcaseを実行させるためにfallthroughキーワードが追加されました。ただし、fallthroughは次のcase、defaultの中の文を実行するのみで、case文に入る前の条件チェックは行わないことに注意してください。
また、ループにラベルを付けて、breakやcontinueするループを指定できるようになりました。
そのほか、列挙型(enum)とswitch文を組み合わせることもできます。こちらは列挙型の解説で紹介します。
次回は
Swiftの言語仕様について、Objective-Cと比較しながら説明してきましたが、いかがでしたか。型だけでも、十分おもしろそうな言語だと感じられたのではないでしょうか。次回は、関数とクロージャを取り上げます。お楽しみに。
