Optional Values
Swift has a nil
keyword that is sort of like the None
keyword in Python; however, regular variables and constants cannot be nil
. In order for a variable to be nil
, it must be initialized as an optional. (Constants cannot be nil
or optional.) An optional is decalred by appending a question mark the variable type. For example, the two statements below are equivalent.
var x: Int? = nil var x: Int?
Forced Unwrapping
Declaring a new variable y
with the value of x
will make y
optional also. In order to create a regular variable y
that is not optional, we must perfrom a forced unwrapping of x, using the exclamation mark.
var y = x // declares y as an "Int?" var y = x! // throws an error b/c x is nil x = 5 // assign 5 to x var y = x! // declares y as "Int" with value 5
Optionals in Conditionals and Assertions
One way to check the state of an optional variable is from within an if
statement or a while
statement.
if x != nil { println("x is not nil!") } else { println("x is nil") }
Another way to check that an optional is, or is not nil
is to use an assertion.
var x: Int? assert( x != nil )
Here, the assertion will fail, and the program will exit.
Optional Binding
Forced unwrapping forces an optional variable to return a regular value. However, if the unwrapped value is nil
, then you get an error. Therefore, when using forced unwrapping, you must be sure that the unwrapped value is not nil
. This can be done through optional binding, this is where you attempt to bind the optional variable to a new temporary variable in a conditional. If the binding works, the conditional returns True, otherwise if fails and returns false. This can be done with if
statements and while
statements.
if var tmp = x { println("x is not nil!") } else { println("x is nil") }
Nil Coalescing Operator
We do not always have to wrap optional variables in an if-else
structure, we may sometimes be able to use the nil coalescing operator. This operator returns the optional variable if it is not nil
, otherwise it returns some value specified by the user. An example,
var x: Int? = nil var y = x ?? "00" println( y ) // returns "00" var u: Int? = 5 var v = u ?? "00" println( y ) // returns 5