脳汁portal

アメリカ在住(だった)新米エンジニアがその日学んだIT知識を書き綴るブログ

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"

Rubyでのnilの扱い

Rubyは全てを受け入れる・・・
  • Rubyではnilだろうがなんだろうが代入できる。
foo = nil
puts foo  # => nil
puts foo.class # => NilClass

その代わりに値が入っていないことに関連したエラーには気を配らなければならない

foo.each{|i|
  puts i
}
# ===> 
#NoMethodError: undefined method `each' for nil:NilClass
#	from (irb):5
#	from /usr/bin/irb:12:in `<main>'




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"