값이 있을 수도 있고 없을 수도 있는 상황에서 옵셔널을 사용하며 ?로 나타낸다.
옵셔널로 래핑해놓은 값을 언래핑하여 그 값에 접근할 수 있는 경우와 값이 전혀 없는 경우 두 가지 가능성이 있다.
옵셔널 타입끼리의 연산은 불가능하다.
#### nil
- 변수에 nil을 할당함으로써 값이 없는 상태의 옵셔널 프로퍼티를 만들 수 있다.
옵셔널 값이 빈 값인지 검사한 후, 값이 존재한다면 그 값을 다른 변수에 대입시켜 바인딩하는 것
if let / if var / guard let / guard var를 써서 옵셔널 값을 추출해 새로운 변수에 바인딩한다.
if let은 if문의 코드 구현부 내에서만 상수 사용이 가능.(지역 변수)
guard let은 guard문을 통과한 상수를 guard문 밖에서 사용이 가능.(전역 변수)
let friendsnumber: Int? = nil
if let friends = friendsNumber {
print(friends)
}
func opbinding() {
guard let x = x else { return }
print(x)
guard let y = y else { return }
print(y)
}
!를 써서 강제로 옵셔널을 추출한다.
잘못 사용할 경우 프로그램이 비정상적으로 종료될 수도 있으므로 반드시 nil이 아닌 것이 확실한 상황에서 사용해야 한다. (최대한 지양)
??을 사용하여 기본값을 사용할 수 있는데, ??을 사용하여 기본값을 부여한 변수는 옵셔널 타입이 아니다.
let(var) a = b ?? c 형태로 이루어지는데 b는 옵셔널 타입이고, b가 nil일 경우 a에 c가 대입되고, nil이 아닐 경우 옵셔널을 제거한 값이 a에 대입된다.
옵셔널을 연쇄적으로 사용하는 것
.을 통해 내부 프로퍼티나 메서드에 연속적으로 접근할 때 옵셔널 값이 있으면 옵셔널 체이닝으로 접근할 수 있다.
struct Person {
var name: String
var address: Address
}
struct Address {
var city: String
var street: String
var detail: String
}
let sam: Person? = Person(name:"Sam", address: Address(city:"서울",street:"신논현로",detail:"100")
sam?.address.city