読者です 読者をやめる 読者になる 読者になる

雨に唄えばおじさんと揚げ玉ビーチ

Uva Advent_Calendar_2016

www.adventar.org

╰( ´◔ ω ◔ `)╯ またまた Swiff の話だ

╰( ´◔ ω ◔ `)╯ 多分な

換気扇の空、オリーブオイルの海、揚げ玉の海岸。
雨に唄えばおじさんは自分が厄介な場所に来てしまったことを悟った。

ということで、以下のコードはコンパイルエラーになる(はず):

let hoge : Nil  = nil;         // Nil のみの型を持つ変数の宣言はコンパイルエラーになる。

let piyo : int? = nil;         // Nil 許容型の変数に nil を初期値として設定するとコンパイルエラーになる。

let fuga : int  = nil;         // 整数型の変数に nil を初期値として設定するとコンパイルエラーになる。

hoge の方は、やっても意味がない宣言だと思う。nil しか設定できないし……。

piyo の方は、null 排斥運動におけるコンパイルエラー。
多くの場合、最初に null が入っているから NullReferenceException が送出されるので、 null を初期値として設定しないようにすれば多くの場合 NullReferencException を退けられるだろうという考えらしい。
Wikipedia では「安全性のために」としか書いてないけど。

fuga の場合はそりゃそーだよなって感じ。int 型の変数に nil は設定できない。

でも、こっちはどうだろう:

let hage = getHage();

getHage() がこうなっていると:

def getHage() : int? {
    if true {
        return nil;
    }
    42;
}

hage には nil が設定される。
こういう場合は、「nil しか返ってこなさそうですよ」って Warning を表示した方が良いんだろうか?
っていうか、こういう場合、Visual Studio*1 では到達不可能なコードなんちゃらあるって言われるよな………。

こういう場合は、やっぱりなんともならないよなぁ:

let hyoga = int.parse( "X" );

まあ、関数の戻り値の nil はいいことにしようっていうか、リテラルとしての nil を設定するのがダメってことなんだもんね。

あと、複合型の Nil 許容型とジェネリックな Null 許容型が 2 つあるとよくない気がしなくもない。

*1:っていうか csc とか