The Swift Programming Language 勉強記録 - 1

だいぶ間が空いてしまいました。。。
まぁ引っ越しとか色々忙しかったからですね、はい。
個人的にやりたいことも積もってきましたが、そのうちの一つがSwift
というわけで、『The Swift Programming Languageを基にSwiftについて勉強した記録その1』です。

optional value

Swiftはただの変数宣言ではnilを代入することはできない。

var str: String = "Hello, world!"
str = nil // 静的解析時エラー

nilを代入するためにはoptional valueとして宣言する必要がある。
optional valueとして宣言するには型の後ろに?をつける。

var str: String? = "Hello, world!"
str = nil

この言語仕様のおかげで、変数利用時にnilが入っている可能性があるかないかが明示的となり、実行時にnilに起因したクラッシュを回避しやすくなる。

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 largestNumber = 0
var largestKind = ""
for (kind, numbers) in interestingNumbers {
    for number in numbers {
        if number > largestNumber {
            largestNumber = number
            largestKind = kind
        }
    }
}
largestNumber // 25
largestKind // Square

switch

breakが不要。
case節に最低1文の処理が必要なため、何もしない場合はbreakを使うと良い。
default節は取りうるすべての値をカバーしていない限り省略不可。
breakしたくないときはfallthroughをcase節の末尾に記述。

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)?"
    fallthrough
// 仮にdefault節をコメントアウトした場合、以下のエラーが出る
// Switch must be exhaustive, consider adding a default clause
default:
    let vegetableComment = "Everything tastes good in soup."
}
// "Is it a spicy red pepper?"
// "Everything tastes good in soup."

range

..< と ... は range operatorになっていて範囲指定ができる。

// ..<で末尾の値を含まないrange
var firstForLoop = 0
for i in 0..<4 {
    firstForLoop += i
}
firstForLoop // 6

// ..<と全く同じ
var secondForLoop = 0
for var i = 0; i < 4; ++i {
    secondForLoop += i
}
secondForLoop // 6

// ...を使った場合は末尾の値を含む
var thirdForLoop = 0
for j in 0...4 {
    thirdForLoop += j
}
thirdForLoop // 10

とりあえずその1はここまで、です。
続くかなぁ。。。