SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

アップルの新プログラミング言語「Swift」を探検しよう

新プログラミング言語「Swift」の型と制御構文

アップルの新プログラミング言語「Swift」を探検しよう 第1回


訂正: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と比較しながら説明してきましたが、いかがでしたか。型だけでも、十分おもしろそうな言語だと感じられたのではないでしょうか。次回は、関数とクロージャを取り上げます。お楽しみに。

この記事は参考になりましたか?

連載通知を行うには会員登録(無料)が必要です。
既に会員の方はを行ってください。
アップルの新プログラミング言語「Swift」を探検しよう連載記事一覧

もっと読む

この記事の著者

yad(ヤド)

クラスメソッド株式会社のアプリケーションエンジニア。iPhoneアプリケーションの開発に2年以上従事している。開発に使用するObjective-Cのみならず、関数型言語Haskellや機械学習などにも関心がある。「Developers.IO」に寄稿した記事の一覧

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/7842 2014/12/05 20:29

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー