
옵셔널(Optional)
var optionalInt : Int? = 42
var optionalString : Optional<String> = "42"
var num1: Int? = 4
var num2: Int? = 2
num1 + num2
//Binary operator '+' cannot be applied to two 'Int?' operands
//Optional(4) + Optional(2) 옵셔널타입끼리는 연산 불가능!
nil
Swift에서는 기본적으로 변수 선언시 nil 값이 들어가는 것을 허용하지 않는다
하지만 옵셔널은 가능!!
변수에 nil을 할당함으로써 값이 없는 상태의 옵셔널 프로퍼티를 만들 수 있다.
또한 Swift에서 nil은 optional 변수 이외에서 사용할수 없고 null과 달리 nil은 단순히 value가 없는 것을 의미함.
var num: Int? // num은 자동으로 nil로 설정된다.
var num2: Int? = 42
num2 = nil
옵셔널 바인딩(Optional Binding)
옵셔널 바인딩은 옵셔널 값이 빈값인지 존재하는지 검사한 후, 존재하는 경우 그 값을 다른 변수에 대입시켜 옵셔널을 해제해준다
빈값을 체크하고 옵셔널 값을 언래핑 해주는 것은 ! 강제로 언래핑하는 것보다 훨씬 안전하다
언래핑 방법에는 if let, if var, gurad let, guard var가 있다
if let 과 guard let의 차이점
if let변수는 지역변수 이고 guard let변수는 전역변수이다
let num: Int? = 123
if let bindingNum = num {
print(bindingNum)
}
//출력문 1234
print(bindingNum)
// error if 지역변수이기 때문이다.
let a: Int? = 10
let b: Int? = nil
func binding() {
guard let a = a else {return}
print(num)
guard let b = b else {return}
}
binding()
//출력문 10
var force : Int? = 42
print(force!)
//강제언래핑 출력문: 42
옵셔널 변수 값이 nil일 경우 default값 설정해주기
var a : Int? = 1
let number = a ?? 0
//출력문: 1
// a에 값이 들어가있기 때문에 1이 출력된다
var b: Int? = nil
let number2 = b ?? 0
//출력문 0 b가 nil이기 때문에 default값이 나옴
옵셔널 체이닝 (Optional chaining)
언래핑 없이 옵셔널 값의 멤버에 접근한다
프로퍼티, 메서드 또는 서브 스크립트를 호출하려는 옵셔널 값 뒤에 물음표 (?)를 배치하여 옵셔널 체이닝 지정
옵셔널이 nil일 경우 옵셔널 체이닝은 nil을 반환하는 반면에 강제 언래핑은 런타임 에러
class Person {
var name: Country?
}
class Country {
var region = "Korea"
}
let person = Person()
let nation = person.name!.region
//런타임 에러 발생
//대신 옵셔널 체이닝 사용
if let region = person.name?.region {
print("Now I live in Korea")
}