-->

Swift

変数宣言の型の後に!を付けることでもnilを代入できるようになる。この場合、nilも値も普通に代入できる。(コンパイルエラーにならない)
nilを代入したまま、メソッド呼んだり、プロパティ参照したりすると、そこでプログラムの実行が止まる。

var hoge:String! = "abc"

println(hoge)   // "123"と表示

hoge = nil
println(hoge)   // "nil"と表示

println(hoge.uppercaseString)   // ここで止まる

どっちにしろ、nilかどうかをチェックしないといけないのでこの方法は使わず、変数宣言で?を指定しておいて、値を参照する場合は、if let 〜{}を使うようにするのが、nilチェック忘れをコンパイル時にわかるのでいいんじゃないかな。


このエントリーをはてなブックマークに追加

こんな感じ。

enum Week {
    case Sunday
    case Monday
    case Tuesday
    case Wednesday
    case Thursday
    case Friday
    case Saturday
}

var day:Week = Week.Sunday

switch day {
case Week.Sunday:
    println("Sunday")
case Week.Monday:
    println("Monday")
case Week.Tuesday:
    println("Tuesday")
case Week.Wednesday:
    println("Wendnesday")
case Week.Thursday:
    println("Thursday")
case Week.Friday:
    println("Friday")
case Week.Saturday:
    println("Saturday")
}

この場合、C言語みたいに数値を割り当てる。

enum Week:Int {
    case Sunday = 1
    case Monday         // 2
    case Tuesday        // 3
    case Wednesday      // 4
    case Thursday       // 5
    case Friday         // 6
    case Saturday       // 7
}

var day:Week = Week.Wednesday

println(day.rawValue)   // 値を取り出して表示("4"を表示)

文字列も割り当てられる。

enum Week:String {
    case Sunday = "Sun"
    case Monday = "Mon"
    case Tuesday = "Tue"
    case Wednesday = "Wed"
    case Thursday = "Thu"
    case Friday = "Fri"
    case Saturday = "Sat"
}

var day:Week = Week.Wednesday

println(day.rawValue)   // 値を取り出して表示("Wed"を表示)

メソッド、プロパティとかも書ける。それは、またそのうち。


このエントリーをはてなブックマークに追加

まあ、よくあるクロージャだ。

func getCounter()->()->Int {
    var counter = 0
    return { () in ++counter }
}

var countUp = getCounter()
println(countUp())  // "1"を表示
println(countUp())  // "2"を表示
println(countUp())  // "3"を表示

getCounter()は、getCounter関数のローカル変数counterをインクリメントする関数(クロージャ)を返す関数だ。


このエントリーをはてなブックマークに追加

Swiftのクロージャは、他言語のラムダ式みたいなもん。あと、一般的なクロージャの意味も含んでいる。

let nums = [3, 2, 5, 4, 1]

let sortedNums = nums.sorted({(a:Int,b:Int)->Bool in
    return a < b
})

println(sortedNums) // "[1, 2, 3, 4, 5]"と表示

inのあと、return文しかない場合、returnを省略できる。
この場合、型推論も効くので引数の型も戻り値の型も省略できる。

let nums = [3, 2, 5, 4, 1]

let sortedNums = nums.sorted({a,b in a < b})

println(sortedNums) // "[1, 2, 3, 4, 5]"と表示

引数の()は、なんで省略できるんだろう(笑)

さらに、引数のa、bも省略できる。この場合、引数の1つ目は$0、2つ目は$1、・・・となる。

let nums = [3, 2, 5, 4, 1]

let sortedNums = nums.sorted({ $0 < $1 })

println(sortedNums) // "[1, 2, 3, 4, 5]"と表示

さらに、省略。ここまでくると、なんだかな〜w

let nums = [3, 2, 5, 4, 1]

let sortedNums = nums.sorted(<)

println(sortedNums) // "[1, 2, 3, 4, 5]"と表示

あと、関数にわたすクロージャが最後の引数の場合、外に追い出せる。

let sortedNums = nums.sorted({a,b in a < b})

これの場合、こんなふうに書ける。

let sortedNums = nums.sorted(){
    a,b in a < b
}

このエントリーをはてなブックマークに追加

オプショナルは、空の状態を持てる変数だ。空はnilで表せる。
変数宣言の型の後に?を付ける

var hoge:Int?
hoge = nil

var hoge2:Int
hoge2 = nil       // エラーになる。

オプショナルをそのまま使うとエラーになる。nilかどうかチェックしてnilでなければ変数に!をつけて値にアクセスできる。

var hogeOpt:Int? = 10

if hogeOpt != nil {
    println(hogeOpt!)     // 10が表示される
}

またこう言うふうにも書ける。オプショナルバインディングって言う。

var hogeOpt:Int? = 10

if let hoge = hogeOpt {
    println(hoge)     // 10が表示される
}

また、複数のオプショナルで上記のような処理を行うには、,で複数個指定する。

var hogeOpt1:Int? = 10
var hogeOpt2:Int? = 20

if let hoge1 = hogeOpt1, let hoge2 = hogeOpt2 {
    println("hoge1=\(hoge1), hoge2=\(hoge2)")   // "hoge1=10, hoge2=20"と表示
}

hogeOpt1、hogeOpt2どちらかがnilなら、falseになり表示されない。


このエントリーをはてなブックマークに追加

↑このページのトップヘ