참고: https://www.youtube.com/watch?v=V6-WmAh4Y1E&list=PLJqaIeuL7nuFbWKMhG8-xLzF1T7gIPr8Z&index=26
옵셔널(optional)은 변수/상수에 아무런 값이 할당되지 않는 상황을 안전하게 처리하기 위한 방법이다. 그리고 옵셔널 타입이어야 nil을 할당할 수 있다. var a = nil 이렇게 작성하면 에디터에 에러가 나타난다. a가 옵셔널 타입임을 명시해준 후에야 nil을 할당할 수 있다.
var a : Int?
a라는 옵셔널 Int 형의 변수를 선언한 것이다. 이 변수에는 Int 형의 값을 할당할 수도 있고 값이 없을 수도 있다. (nil)
만약 a에 값을 할당하면 그 값은 옵셔널로 감싸지게 된다.
a = 10
print(a) // Option(10) 과 같이 옵셔널로 감싸진 10이 된다.
10에 접근하려면 먼저 10을 감싸고 있는 옵셔널을 벗겨야 한다.
옵셔널을 벗기는 방법 첫번째: 변수 이름 뒤에 ! 붙이기
var a : Int?
a = 10
print(a) // Optional(10)
print(a!) // 10
변수 이름 뒤에 ! 붙여서 옵셔널을 벗기는 것을 forced unwrapping이라고 한다. ! 로 옵셔널을 벗길 때는 해당 변수에 값이 100% 확실하게 있을 때 사용하는 것이 좋다. 왜냐면 옵셔널형 변수를 선언만 하고 값을 할당하지 않으면 기본적으로 그 변수는 nil인데, nil을 !로 강제로 옵셔널을 벗기려고 하면 에러가 발생하며 프로그램 실행이 멈추기 때문이다.
var x : Int? // x에 값을 할당하지 않는 이상 x는 nil
그러므로 ! 사용하여 옵셔널을 벗길 때는 nil인지 아닌지 확인하고 사용해야 한다.
var x : Int?
x = 10
if x != nil {
// do something...
} else {
// do something else...
}
(이거 말고 옵셔널 바인딩이라고 더 많이 사용하는 방법이 있는데 그것은 아래에...)
왜 forced unwrapping !을 '변수 이름 뒤'에 붙여야 한다고 강조를 했냐면 !가 타입 뒤에 붙으면 옵셔널형 변수를 선언하는 것이기 때문이다. 그러니까 사실 옵셔널형 변수를 선언하는 방법은 두 가지였다... 보통 ? 을 사용하여 옵셔널형 변수를 선언하는 일이 많다고 한다. ! 로 된 옵셔널형 변수는 xcode에서 ui 요소에 연결하는 IBoutlet 관련하여 볼 수 있는데, 옵셔널이 항상 유효한 값을 가질 때 ! 이 붙은 옵셔널형 변수를 선언한다.
var firstName : String?
var firstName : String! // implicit optional
옵셔널을 벗기는 방법 두번째: 옵셔널 바인딩 (optional binding)
옵셔널을 벗길 때는 이 방법을 많이 쓴다고 한다. 옵셔널형 변수에 값이 있으면 if 글자 앞에 있는 변수에 그 값을 대입하고 if 부분을 실행하며 만약 옵셔널 변수에 값이 없으면 if 부분을 실행하지 않는다. else 부분 있으면 else가 실행되겠쥬
let myName = "apple"
if let userName = myName { // var도 당연히 사용 가능
} else {
}
여러 옵셔널을 풀 수도 있다. 다만 옵셔널형 변수들 중에 하나라도 nil이 있으면 if 부분이 실행되지 않는다.
let firstTime = 10
let secondTime = 20
// 둘 중에 하나라도 nil이면 if 부분을 실행하지 않는다
if let userTime = firstTime, let adminTime = secondTime {
} else {
}
'swift & iOS > swift' 카테고리의 다른 글
[swift] 타입 캐스팅 (형 변환) (0) | 2022.01.10 |
---|---|
[swift] Any, AnyObject (0) | 2022.01.10 |
[swift] switch vs. if 언제 쓸까? (짧음 주의) (0) | 2022.01.09 |
[swift] 튜플(tuple) 생성과 값 접근하는 방법 (0) | 2022.01.08 |
[Swift] 함수 - 파라미터 간단 정리 (0) | 2022.01.07 |