BossGiveMeArrays BossGiveMeArrays - 10 months ago 24
Swift Question

For Swift, is Double? the same as Optional<Double>?

var title: Double? = nil
var title2 = Optional<Double>.None

The two things above seem to both behave as optional Doubles. But when I hold option and click on
, it shows that they have different types. One is
and the other is
. I'm just wondering if theres a difference between the two. And if they aren't different, why even have two of them? Was Optional an objective C thing that got transferred over to swift or something?


There is no difference, and there is nothing special about Double here.

For any type T, T? is a (compiler built-in) shortcut for Optional<T>. So

var value: T?
var value: Optional<T>

are equivalent. Optional conforms to the NilLiteralConvertible protocol, i.e. a value can be instantiated from the literal nil, and

var value: T? = nil
var value: T? = .None
var value: T? = Optional.None
var value: T? = Optional<T>.None
var value: T? = T?.None

are all equivalent. In the first three statements, the type Optional<T> of the value on the right-hand side is inferred from the type annotation on the left-hand side. The last two statements can be shortened to

var value = Optional<T>.None
var value = T?.None

because the type is inferred automatically from the right-hand side.

Finally, since optionals are implicitly initialized to .None, all of the above statements are equivalent.