thank you.
i am continuing to analyze this problem, such a interesting one.
I made a custom type that conforms ExpressibleByNilLiteral and tested some expressions.
struct A: ExpressibleByNilLiteral {
init(nilLiteral: ()) {}
}
let a0: A? = nil // nil
let a1 = A?(nil) // nil
let a2 = A?(nilLiteral: ()) // nil
let a3 = A?.init(nil) // compile error
let a4 = A?.init(nilLiteral: ()) // nil
let a5 = A??(nil) // nil
let a6 = A??.init(nil) // Optional(nil)
let a7 = A???(nil) // nil
let a8 = A???.init(nil) // Optional(nil)
so i just thought that passing a nil
literal without specifying init is equivalent to calling init(nilLiteral:)
, but specifying init and passing a nil
literal is equivalent to calling init(_:)
.
in nested optional case, result of A??(nil)
is nil
, because it is guessed that it called init(nilLiteral:)
.
and result of A??.init(nil)
is Optional(nil)
, because it is guessed that it called init(_:)
.
it is just an assumption, i also wonder if this inference makes sense