nil = 값이 없다.
let optionalNum: Int? = nil
TypeName || TypeName?
Non-Optional Type Optional Type
let str: String = "Swift" // Non-Optional Type
let optionalStr: String? = nil // Optional Type(nil)
let a: Int? = nil
let b = a
b // nil
var num: Int? = nil
print(num) // nil
num = 123 // 123
print(num) // Optional(123)
let n = 123 // 123
print(n) // 123
강제적 추출 옵셔널
OptionalExpression!
print(num) // Optional(123)
print(num!) // 123
num = nil
// print(num!) -오류 옵셔널 하는 도중 nil값이 발견되면 오류
if num != nil{
print(num!)
}
num = 123
let before = num
let after = num!
Syntax
- if let name: type = OptionalExpression {
statements
}- while let name: type = OptionalExpression {
statements
}- guard let name: type = OptionalExpression else {
statements
}
var num: Int? = nil
if num != nil {
print(num!)
} else {
print("empty")
}
if let num = num {
print(num)
} else {
print("empty")
}
var str: String? = "str"
guard let str = str else {
fatalError()
}
str
// guard에서는 이름을 else블럭 다음(코드가 끝난 뒤) 사용가능하다
num = 123
if var num = num {
num = 456
print(num)
}
let a: Int? = 12
let b: String? = "str"
if let num = a, let str = b, str.count > 5 {
}
// if 블럭은 바인딩이 끝나고 실행 됨
Type!
IUO - 암시적 추출 옵셔널
let num: Int! = 12
let a = num
a // 12
let b: Int = num
b // 12
기억하기
- 문법적으로만 이해
- IUO는 자료형 이름 뒤에 !가 붙어있는 형태
- IUO는 처리할 자료형, Non 옵셔널 타입을 직접 지정하면 Unwrapping된다.
var msg = ""
var input: String? = "Swift"
if let inputName = input { // 옵셔널 바인딩 성공
msg = "Hello, " + inputName
} else {
msg = "Hello, Stranger"
}
print(msg)
var str = "Hello, " + (input != nil ? input! : "Stranger") // 조건 연산자
print(str)
Syntax
a ?? b
OptionalExpression ?? Expression
이항연산자 -> 피연산자가 2개
왼쪽 옵셔널표현식 ?? 오른쪽 Non옵셔널 표현식
input = nil
str = "Hello, " + (input ?? "Stranger")
print(str) // Hello, Stranger
왼쪽 피연산자 값이 저장되어 있다면 출력하고, 왼쪽 값이 저장되어 있지 않다면 오른쪽 값 출력