옵셔널이란 ?
스위프트 언어를 보다 안정적으로 사용할 수 있게하기 위함이며
Optional , 선택적인 뜻으로 값이 있으면 추출하고 없으면 nil을 반환하는 것
변수 또는 상수에 값이 있을 수도있고 없을 수도 있는 암시적 표현이다.
#선언은 두 가지 방법이 있다
Var optionalName: String? = “Value” // 읽기 편함
Var optionalName: Optional<String> = “Value” // FM
옵셔널의 특징
- 값 교류나 연산을 할 수 없다. 왜냐하면 옵셔널값은 별개의. 타입이기 때문에 Int값과 연산이 어려움
- 옵셔널 체이팅 사용할 수 있는 값에는 프로퍼티, 메소드 그리고 서브스크립트가 포함 됩니다. (옵셔널 체이팅에대해서는 다음에 다룰예정입니다.)
- 옵셔널의 default값은 nil이다.
옵셔널 추출(Optional Unwrapping)
1. 강제추출
2. 옵셔널 바인딩(권장)
3. 암시적 추출 옵셔널
- 강제 추출 (Forced Optional)
// 이건 변수라는 유리박스안에 옵셔널이라는 박스안에 값이 있다고 가정하면
유리박스을를 망치로 박스를 깨부시고 강제로 값을 꺼내오는 행위와 같다.
값이 nil일 경우에는 런타임오류가 발생할 수 있으니 이해는 해두되 강제추출은 지양하는 것이 좋을 수 있다.
예시)
func printName1(_ name: String){
print(name)
}
var myName2: String? = nil
//printName(myName1) //"선택적 유형 'String?'의 값은 'String' 유형의 값으로 래핑 해제되어야 합니다."라는 컴파일 오류가 납니다.
//전달되는 값의 타입이 다르기때문
myName2 = "lim"
printName(myName2!)
// " lim " 값이 호출됨
String안에 옵셔널 타입인 String? 를 전달하면 값의 타입자체가 다르기때문에 컴파일 오류가 발생한다.
- 옵셔널 바인딩(Optional Binding)
옵셔널안에 바인딩은 값이 있는지 없는지 확인해줄때 사용된다. 실제로 사용할때는 if나 while문을 통해서 변수나 상수에 값을 할당하여 옵셔널 상태가 아닌 값으로 사용 할 수 있도록 해줌
예시)
var myName: String? = "Kaui"
var yourName: String? = nil
if let name = myName, let friend = yourName{
print("\(name)and\(friend)")
}//yourName이 nil이기 때문에 실행되지 않습니다.
yourName = "euna"
if let name = myName, let friend = yourName{
print("\(name)and\(friend)")
}
//"Kauiandeuna" 값이 호출됨
- 암시적 추출 옵셔널(Implicitly Unwrapped Optionals)
암시적 추출 옵셔널은 타입 뒤에 ? 대신 !를 사용하여 값이 없이 추출하는 런타임오류가 발생하지않을 거라는 확신이 있을때 사용하는것으로 이해했다.강체추출처럼 안전하지않고 크게 다를 게 없는 부분인것같다.
func printName1(_ name: String){
print(name)
}
var myName2: String! = "kaui"
printName1(myName2)
//'kaui갑 호출'
값타입이 다를 경우 컴파일 에러가 나지만 !강제추출로 가져옴