Swift가 가지고 있는 가장 큰 특징 중 하나가 옵셔널(Optional)이다.
값이 없는데 접근을 하면 어떻게 될까
만약 값이 없는데 값에 접근한다면 에러가 발생한다.
옵셔널은 직역하면 "선택적인"이라는 뜻이 되는데, 값이 있을 수도, 없을 수도 있다는 의미이다.
만약 문자열이 있다고 하면 "가나다"가 될것이다 만약 값이 없다고 하면 ""도 아닌 그저 값이 없다는 것이다. 이런 값 없음을 나타내는 게 바로 nil이다.
nil: 값이 없음을 표현하는 키워드
값 없음을 표현하는 nil을 아무 변수에 사용할 수 있는것은 아니다.
옵셔널 변수에 사용해야 한다.
옵셔널 변수를 선언할 때에는 타입 어노테이션에 ? 를 붙여야 한다.
옵셔널로 선언된 변수와 옵셔널이 아닌 변수는 다르다. 옵셔널이 아닌 변수를 옵셔널 변수에 대입할 순 없다.
옵셔널의 구조
enum Optional<Wrapped>{
case some(Any)
case none
}
옵셔널은 열거형으로 이루어져있다.
case none의 경우 nil인 값이 없다는 의미
옵셔널 타입 추출
옵셔널 타입을 추출하는 방법은 4가지가 있다.
1) 강제추출 (Forced Unwrapping)
nil이 아닌 값이 있다는 것을 확신하는 경우 사용할 수 있다.
⭐️만약 nil값이 있다면 에러가 발생한다.⭐️
2) nil이 아닌지 확인 후, 강제추출
if문을 통해 nil이 아닌지를 먼저 확인 후 강제로 추출한다(1번방법)
에러의 가능성이 없어진다.
3) 옵셔널 바인딩 ⭐️⭐️⭐️
if let / guard let 바인딩을 사용한다.
바인딩(상수나 변수에 대입)이 되는 경우만 특정 작업을 수행한다.
일반적인 경우 이 방법을 사용한다.
if let 바인딩
str이란 옵셔널 변수가 s라는 상수에 대입되는 경우만 내부의 작업을 실행한다.
guard let 바인딩
n이란 변수에 name이 대입되는 경우에 { return } 이하를 실행한다.
대입되지 않는 경우에는 { }내부를 실행한다.
4) Nil-Coalescing ??
옵셔널 표현식 뒤에 기본값을 제시한다.
옵셔널 체이닝
옵셔널 타입으로 선언된 값에 접근해서 속성, 메서드를 사용할때 접근연산자(.)앞에 ?(물음표)를 붙혀야한다.
앞의 값이 옵셔널의 가능성을 내포한다는 의미이다.
규칙
1. 결과는 항상 옵셔널 타입으로 리턴된다.
2. 옵셔널 체이닝 과정에서 값중 하나라도 nil을 리턴한다면 이어지는 표현식을 평가하지 않고 nil을 리턴한다.
IUO타입 -Implicitly Unwrapped Optionals(암시적 추출 옵셔널 타입)?
(제한적인 상황에서) 벗겨질 준비가 되어있는 타입
- 옵셔널 타입(String?)과 동일하다고 생각해도 무방함
- 제한적인 경우 암묵적으로 추출. 벗기지 않고 옵셔널 타입처럼 사용도 가능
- 옵셔널 타입이 아닌 변수/상수에 저장하는 경우 자동 추출
- nil을 할당할 수도 있지만 로직상 값이 항상 있다는 것이 확실할 때 사용
- 스토리보드와 Outlet연결 시 주로 활용
- 옵셔널 체이닝 . (접근연산자)를 사용할 때 ? 를 사용하지 않아도됨
개발자가 실수할 가능성을 낮춰준다 ==> 옵셔널 체이닝이 필요 없기 때문