옵셔널이란 타입에 값이 있을 수도, 없을 수도 있음을 표현한 것
var Name: String?
이는 Name 변수에 String형 값이 들어갈 수도 있고 아닐 수도 있다는 뜻을 갖게 된다. 예외 상황을 최소화하는 안전한 코딩을 위해서 사용한다.
값이 없음은 nil을 통해서 나타내는데, 옵셔널은 이 nil이 할당될 수 있는지 없는지를 표현한 것이다.즉, ?을 변수 옆에 붙이면 nil 값을 가질 수 있다는 의미가 된다. 옵셔널 타입이 아닌 경우에 nil 값을 갖게 되면 오류가 발생한다.
var Name: String = nil //error
var Name: String? = nil //가능
옵셔널 타입의 값은 옵셔널 안에 갇혀 있는 형태로 저장되어 있기 때문에 추출해서 사용해야 한다. 그 방법으로는 크게
이름에서도 알 수 있듯이 옵셔널에 값이 들어있는지 아닌지 확인하지 않고 강제로 값을 꺼내는 방법이다. 값이 있다면 바로 출력되지만, 값이 없는 nil이라면 에러가 발생한다. !을 뒤에 붙여서 사용한다.
var Name: String? = "챈토피아"
print(Name!)
//출력 : 챈토피아
이렇게 값이 있는 상태라면 바로 출력이 가능하지만
Name = nil
print(Name!)
//error
이렇게 값이 없는 nil 상태라면 에러가 발생한다.
옵셔널 바인딩이란 옵셔널 안에 값이 있는지 확인하고, 값이 있으면 꺼내오는 것을 말한다. 옵셔널 바인딩에는 방법이 두 가지인데, 첫번째는 If let을 사용하는 것이다.
값이 있다면 if let문의 내용이 실행되고, 없다면 else문의 내용이 실행된다.
func printName(_name:String) {
print(_name)
}
var nyName: String? = nil
if let name = myName {
printName(_name:name)
}
//아무것도 출력되지 않는다.
if let 구문은 myName이 nil이 아니라 값이 있으면 name에 넣어주고 조건문을 실행하는 구문인데, myName이 nil로 초기화되어 있기 때문에 조건문이 실행되지 않는다. if let에서 선언된 것을 if문 밖에서 쓸 수는 없다.
앞서 본 if let과 같이 옵셔널 안에 값이 있는지 확인하고, 값이 있으면 꺼내오는데, 값이 있다면 뒤의 코드로 이어지고 값이 없다면 else에서 처리된다.
또한, else에서 return, break 처럼 코드를 종료시키는 명령어가 필요하다.
func printName(_name:String) {
var myname : String? = nil
guard let name = myName else {
print("noName") //nil일 때 출력
return
}
printName(_name:name) //값이 있을 때 출력
}
guard let은 보통 함수 안에서 사용된다. if let과 달리 guard let에서는 선언된 것이 guard문 밖에서도 사용 가능하다. 그러나 else에 대한 처리를 해주지 못한다.
옵셔널 바인딩은 데이터를 안전하게 전달하는 방법이다.