Swift言語の中には、1つだけ「型」とその型に含まれる「値」に同じ表記を使うものがあって、それが()
、型として使う場合の別名はVoid
です。
他言語のvoidの使い方に慣れていると非常に戸惑ってしまうのですが、SwiftではVoid型の変数を宣言して、値を代入できたりなんかもします。
var myVoid: Void = ()
この(初期値付きの)変数宣言は、次と全く同じものです。
var myVoid: () = ()
この場合、前半の()
は型、後半の()
は値(つまり空tuple)として使われています。
Swiftで、引数なしで値を返さない関数型の表記は、()->()
、()->Void
とかVoid->Void
とかいろいろ書かれます(Void->()
も同じだがあまり見たことがないです)が、全て同じ意味です。
つまり、
init(nilLiteral: ())
というイニシャライザは
init(nilLiteral: Void)
と全く同じで、引数として空タプルだけを受け取ることを表しています。
他言語のnullもよく突き詰めて考えると意味不明だったりするのですが、Swiftのnilは「リテラル(Swiftではリテラルには型は無い)で、literal convertibleなメソッドを持つことで、必要な値に変身します」と言うのはわたし的には(他言語よりは)わかりやすいように思うのですが…。
(ご質問の中の1点に答えられていないような気がしたので追記です。)
なぜ、このイニシャライザ呼ばれることになるのでしょうか。
引数を持たない関数を呼び出すときに、なぜ空tupleを渡すとこの関数が呼ばれることになるのか、とはあまり考えないのではないかと思います。NilLiteralConvertibleの場合、引数に渡すべき値が無いので「外部名はあるが引数は持たない」イニシャライザを使っているわけです。
ただ、「なぜ、このイニシャライザ呼ばれることになるのでしょうか。」 での説明がもう一つ理解ができません。
var a : Int? = nil var b : Int? = ()
が同じということでしょうか?
– TAKA Jan 28 '16 at 09:04init(nilLiteral: ())
を呼びさえすればnil
が現れたと言うことは伝えられるので、nilというリテラルがNilLiteralConvertibleと解釈できる場所に現れたらinit(nilLiteral: ())
を何も引数を渡さすに呼ぶのだ、と思ってください。引数の場所に()
(またはVoid
)を書くのは、「引数を取らない」と言うことを表しているのです。 – OOPer Jan 28 '16 at 12:16