Swift - Optionals: Unterschied zwischen den Versionen
Aus Wikizone
| Zeile 67: | Zeile 67: | ||
let myStruct: MyStruct? // optional caus not initialized yet | let myStruct: MyStruct? // optional caus not initialized yet | ||
myStruct = MyStruct() // now it is initialised | myStruct = MyStruct() // now it is initialised | ||
| − | print(myStruct?.myProperty ?? "myStuct is nil") | + | print(myStruct?.myProperty ?? "myStuct is nil - cannot access myProperty") |
/** | /** | ||
Used for optional structs or classes I | Used for optional structs or classes I | ||
| Zeile 73: | Zeile 73: | ||
optional?.method | optional?.method | ||
ONLY IF OPTIONAL IS INITIALISED method will execute or property will accessed | ONLY IF OPTIONAL IS INITIALISED method will execute or property will accessed | ||
| + | |||
| + | the compiler checks if myStruct has a value and only if it has than it will go to the chained method | ||
*/ | */ | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Version vom 6. Januar 2023, 08:37 Uhr
Optionals are a way to prevent code from running in a null exeption.
? declares a optional ! forces a optional to unwrap to original type (with the danger to create an error) ?? is used to give a alternative return if the optional contains nil
/**
Optionals can provide a kind of safety check if variables not set
*/
//var playerName: String = nil // not working - needs to be a String
var playerName: String? = nil // ? declares Optional so the value can be nil or a string
playerName = "jacktheripper" // try commenting out
print(playerName!) // ! is the counterpart of ? it forces to unwrap to a string - error when playerName not set so it's not good style
if playerName != nil {print(playerName)}else{print("no name given")}
print(playerName ?? "no name given") // shorthand for the line above
Optional Anwendungsfälle
// 5 WAYS TO WORK WITH OPTIONALS
let myOptional: String?
myOptional = "Stephan"
// 1. FORCE UNWRAP
let text:String = myOptional!
/**
The least safe way - will crash on runtime if myOptional is nil
so it totally depends on the user to make sure myOptional is valid.
*/
// 2. Check for nil value
if myOptional != nil{
print(myOptional!)
}else{
print("myOptional was found to be nil")
}
/**
More safe but not comfortable
*/
// 3. OPTIONAL BINDING
if let safeOptional = myOptional {
print(safeOptional)
}else{
print("myOptional was found to be nil")
}
/**
Create a safe version of a optional which we can use safely
*/
// 4. NIL COALESCING OPERATOR
let string: String = myOptional ?? "This is a default value"
/**
gives us the possibility to provide an alternative value which is used if Optional as nil
*/
// 5. OPTIONAL CHAINING
struct MyStruct {
var myProperty = 123
func myMethod(){
print("I'm a method")
}
}
let myStruct: MyStruct? // optional caus not initialized yet
myStruct = MyStruct() // now it is initialised
print(myStruct?.myProperty ?? "myStuct is nil - cannot access myProperty")
/**
Used for optional structs or classes I
optional?.property
optional?.method
ONLY IF OPTIONAL IS INITIALISED method will execute or property will accessed
the compiler checks if myStruct has a value and only if it has than it will go to the chained method
*/