Swift에서는 변수에 값이 없다는 것을 표기하기 위한 방법이 존재하는데, 이걸 optional이라고 한다.
변수를 사용하다 보면 아예 값이 없는 경우가 필요할 때가 있고, 이게 0으로 표현하긴 부족할 때가 있다.
이럴 때 optional을 통해 nil이란 값을 넣어준다..
1. Optional이란?
선언은 다음과 같이 한다.
var iAmOptionalInteger: Int?
Swift
복사
자료형 뒤에 ?를 붙여주면 된다! 귀엽다.
초기화해주지 않아도 nil로 초기화된다.
var iAmOptionalInteger: Int? = nil
Swift
복사
두 코드가 같다고 봐도 된다.
이런 변수들은 그냥 쓰면 에러가 나기 때문에, 옵셔널 추출이란 걸 해줘야 쓸 수 있다.
var iAmOptionalInteger: Int? = nil
var giveMeAValue: Int
giveMeAValue = iAmOptionalInteger // 여기서 에러가 난다.
Swift
복사
왜냐? giveMeAValue라는 변수는 nil을 담을 수 없기 때문이다.. 근데 iAmOptionalInteger변수가 nil이 아니고 값을 가지고 있어도 에러는 난다.
value of optional type 'Int?' must be unwrapped to a value of type 'Int'
giveMeAValue = iAmOptionalInteger
replit에서 실행시켜봤을때 대충 이런 에러가 난다. iAmOptionalInteger를 nil이 아닌 값으로 초기화해줘도 같다.
결국 옵셔널 변수를 사용하려면 unwrap이라는 것을 해줘야 하나보다.
호기심이 동해서
var iAmOptionalInteger: Int?
var giveMeAValue: Int? = 1
giveMeAValue = iAmOptionalInteger
print(giveMeAValue)
Swift
복사
이런 것도 실행해봤는데, 경고를 잔뜩 띄우지만 nil을 출력하긴 하더라..
2. unwrap은 어떻게 할까요??
그것이 문제였습니다...
방법이 여러가지가 있어서 더 어려운 것 같다..
•
강제 추출
var iAmOptionalInteger: Int?
var giveMeAValue: Int
giveMeAValue = iAmOptionalInteger!
Swift
복사
이렇게 변수 뒤에 !를 붙이면, nil이 아닌 경우에 값을 꺼내어준다.
그럼 nil이면??
런타임 에러가 난다.. 실제로 프로그램에 사용하는 것은 지양해야 하고, 개발 중에는 터지는 부분을 확인할 수 있어 유용하다고 들었다.
•
옵셔널 바인딩
왜 바인딩이라고 부르는지 잘 모르겠지만..
var iAmOptionalInteger: Int?
var giveMeAValue: Int
if let temporary = iAmOptionalInteger {
giveMeAValue = temporary
} else {
giveMeAValue = 0
}
Swift
복사
위 코드의 경우, iAmOptionalInteger를 임시로 temporary에 할당해주어서 쓴다. 이름이 굳이 temporary일 필요는 없다. 이 let은 해당 {} 안에서만 쓸 수 있다. if문을 벗어나선 쓸 수 없고 당연히 else문에서도 쓸 수 없다.
nil이라면 else문으로 가서 코드블럭 안의 내용을 실행한다.
•
nil 병합
이것도 왜 이름이 병합인지 모르겠다..
var iAmOptionalInteger: Int?
var giveMeAValue: Int
giveMeAValue = iAmOptionalInteger ?? 0
Swift
복사
옵셔널 바인딩 부분의 코드와 같은 결과를 낸다.
iAmOptionalInteger가 값을 가진다면 그것을, 아니라면 “??” 뒤의 값을 giveMeAValue에 준다.
이게 더 편해 보이는데 왜 굳이 옵셔널 바인딩을 하냐? 하면
얘는 대입만 해줄 수 있지만 바인딩에서는 if문 안에서 여러가지 더 복잡한 것들을 해줄 수 있기 때문이지 않을까..라고 짐작한다.