SwiftとRubyのnilとif文の扱い
nil
Swiftでのnilの扱い
JavaでいうNullPointerExceptionを防ぐため、nilは代入自体ができなくなっている
var foo = nil //===> //Playground execution failed: nil_if.playground:5:11: error: expression does not conform to type //'NilLiteralConvertible' //var foo = nil
これはnilが返ってくる可能性があるだけでダメで、もし返ってくる場合は値を受け取る変数をoptional型という型にする必要がある。
型宣言の際に後ろに?とつけるとoptionalという型になり、nilを受け取れるようになる
var foo: String = nil // => NG var bar: String? = nil // => OK
このoptional型は通常の型ではないため、他の型の変数へは普通に代入できない。
(nilが含まれる可能性があるため)
なので、もし代入をしたい場合にはif-let文を使う
var bar: String? = "test" // NG var bar2: String = bar // OK if let bar3: String = bar { println(bar3) } else { println("bar is nil") }
もしくは、以下のような構文を使うこともできる
// var \(変数名) = \(代入したい変数) ?? \(代入したい変数がnilの場合に代わりに代入する値) var foo: String? = "test" var foo2: String = foo ?? "bar" # => "test" var hoge: String? = nil var hoge2: String = hoge ?? "fuga" # => "fuga"
if文 (条件文)
Swiftでの条件文
Swiftでは厳密にboolean(が返り値のもの)しかif文には入れることができない
if true { println("TRUE") } // => "TRUE" if false { println("TRUE") } else { println("FALSE") } // => "FALSE" if "true" { println("TRUE") } // => Playground execution failed: nil_if.playground:16:4: error: 'String' is not convertible to 'BooleanType' if nil { println("TRUE") } // => Playground execution failed: nil_if.playground:16:4: error: expression does not conform to type 'NilLiteralConvertible'
Rubyでの条件文
Rubyは全てを平等に判断してくれる・・・
- Rubyでは条件文にどんな型の値でも入れることができる
- false, nilはfalseとして判断され、それ以外は全てtrueとして判断される
- ""false"という文字列や、空文字("")でもtrueとして判断されるので注意が必要である
if true puts "TRUE" enb # => "TRUE" if false puts "TRUE" else puts "FALSE" end # => "FALSE" if nil puts "TRUE" else puts "FALSE" end # => "FALSE" ### ""false"という文字列や、空白でもtrueとなるので注意が必要 foo = "false" if foo puts "TRUE" end # => "TRUE" bar = "" if foo puts "TRUE" end # => "TRUE"