Could anyone tell me why Xcode's Playground returns nil if I put double question mark instead of single question mark for variable a? Due to overflow result must be 64, not nil.
Swift version 2.2, Xcode version 7.3.1, OS X version 10.11.6
import Cocoa
var b: Int8
var c: String? = "128"
var a: Int8?? = Int8(c!)
b = 64
func nilCoalescing() {
a != nil ? a! : b
}
nilCoalescing()
There's a lot going on here:
a
overflows, becaue 128
is larger than the maximum value that can be stored in an Int8
(Int8.max
= 127
), thus it'll return nil
.
This nil
, a.k.a. Optional.None
is of type Optional<Int8>
is not the type specified by the type annotation of a
(Int8??
, a.k.a. Optional<Optional<Int8>>
), so it's wrapped in another optional, becoming Optional.Some(Optional.None)
, which is now the correct type.
nilCoalescing()
doesn't return anything. (Which actually means it returns ()
, a.k.a. Void
)
Don't do this explicit nil
check and force unwrap (!
): a != nil ? a! : b
. Use ??
instead: a ?? b
What exactly are you trying to do here?