質問: nil 上記のようにnilをオプショナル型に代入するとき、 NilLiteralConvertible のイニシャライザがよばれることで、 nilの代入が可能となるみたいなのですが、 NilLiteralConvertible のイニシャライザの定義が次のようなっています。 ``` init(nilLiteral: ()) ``` これは、型の指定が、空のタプルにもみえますが、空のタプルは「型」ではないですし、 なぜ、このイニシャライザ呼ばれることになるのでしょうか。 また型の「()」は何をいみしているのでしょうか? 教えてください。
回答: 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の場合、引数に渡すべき値が無いので「外部名はあるが引数は持たない」イニシャライザを使っているわけです。