Optional
값이 있을 수도 있고 없을 수도 있다.
Optional은 값이 대입되어 있거나, 아니면 아무런 값이 대입되지 않은 상태(nil)인 type을 말한다.
String? 이라고 표현되면 해당 변수가 String을 갖고 있거나, 아무 값도 없는(nil) 상태라는 것이다.
이는 type casting이나 nil value 체크 등에 있어서 중요한 역할을 한다.
Optional Unwrapping
옵셔널 값은 랩에 둘러싸여 있어 사용하기 위해서는 unwrapping 하는 과정이 필요하다.
강제 해제 (Forced Unwrapping)
아래와 같이 간단하게 !를 사용하여 forced unwrapping을 할 수 있다.
값이 있다는 것이 확실할 때 느낌표(!)를 쓰면 값을 제대로 출력할 수 있다. 하지만 옵셔널을 강제로 해제시키면 optional이 nil 값을 가질 때 에러가 발생해 앱이 꺼질 수도 있다. nil을 unwrapping 하려는 경우 치명적인 오류가 발생할 수 있으므로 주의해야 한다.
var number: int? = 3
print(number) // Optional(3)
print(number!) // 3
느낌표를 찍는 forced unwrapping 을 하지 않으려면 어떻게 해야 할까?
Optional Binding ⭐️
Optional Binding은 optional을 unwrapping 하는 방법 중 하나이다.
바인딩이 된다면, 특정 작업을 하겠다는 의미이다.
옵셔널 바인딩을 사용하면 optional의 값을 안전하게 unwrapping 할 수 있다.
if let
if let 을 이용하여 새로운 상수를 만들어 optional 여부를 판별하고 출력할 수 있다.
number가 nil인지 아닌지 판별 후 상수 result에 저장하고 다음 코드를 실행한다.
var number: int? = 3
if let result = number {
print(result) // 3
} else {
}
참고로 위의 코드보다 if let number = number 로 작성하는 것이 더 나은 코딩이라고 한다.
if let 에서 동일 상수명을 사용하는 것을 shadowing 이라고 한다.
guard let
옵셔널 바인딩은 if else문으로도 가능하지만, guard문으로도 가능하다. else문을 앞에 배치하여 먼저 조건을 판별하여 조기 종료할 수 있다. guard 구문의 조건을 만족하는 경우 코드가 다음 줄로 넘어가서 계속 실행된다. 만약 조건을 만족하지 못하면 else 블럭이 실행되며, 자신보다 상위 코드 블럭을 종료하는 코드가 반드시 들어가야 한다. 코드 블록 종료시 return, break, continue, throw 등 제어문 전환 명령을 사용한다.
이 조건 만족 못하면 내 함수에서 나가! 라고 가드하는 것
if else문은 if 부분만 따로 사용해도 되지만, guard문은 else와 한 쌍이다. 둘은 항상 같이 사용해야한다.
조건을 지키지 못하면 else 에서 return 해야 하기 때문에 guard 뒤에 else가 붙지 않으면 컴파일러가 지적한다.
func downloadImage (from url: URL?) {
guard let url = url else {
print("url is nil. url not found!")
return
}
print("url is not wrapped with optional here: \(url)"
beginDownload(url: url)
}
예외사항만을 처리하고 싶다면 guard 구문을 사용하는 것이 훨씬 간편하다.
guard는 return, break, continue, throw 등의 제어문 전환 명령어를 쓸 수 없는 상황이라면 사용이 불가능하며,
함수(메서드), 반복문 등 특정 블록 내부안에서만 사용이 가능하다.
'iOS > Swift' 카테고리의 다른 글
[Swift] Copy-on-Write(CoW) 알아보기 (0) | 2022.10.02 |
---|---|
[Swift] Class와 Struct의 차이 (0) | 2022.09.29 |
[Swift] 옵셔널 패턴(Optional Pattern) (0) | 2022.09.28 |
댓글