옵셔널 어떻게 꺼내서 활용하고 어떻게 사용할 수 있는지 공부해봤다.
옵셔널의 값을 꺼내는 방법에는 2가지 방법이 있다.
옵셔널 바인딩 | Optional Binding
옵셔널 안에 값이 있는지 확인한 후에 값을 가져오기 때문에 nil 체크를 함과 동시에 안전한 값을 추출할 수 있다.
옵셔널 바인딩은 if-let 구문을 사용해서 옵셔널의 값을 가져올 수 있다.
if-let 구문 또는 if-var 구문을 통해서 옵셔널의 값이 잇는지 없는지 확인하고 가져온다는 뜻인데 예제를 통해 확인해볼 수 있다.
func printName(_ name: String) {
print(name)
}
var myName: String? = nil
if let name: String = myName {
printName(name)
} else {
print("myName == nil")
}
var yourName: String! = nil
if let name: String = yourName {
printName(name)
} else {
print("yourName == nil")
}
==================== 출력 결과 ====================
myName == nil
yourName == nil
String 타입의 값을 출력하는 함수가 있다.
옵셔널 타입의 myName 는 nil 로 초기화 되어 있다.
if-let 구문은 myName 의 값이 있으면 name 에 넣어서 조건문을 실행하라는 것이다.
myName에는 nil의 값이 들어있기 때문에 조건문에 충족하지 않아 아래의 문구를 출력하게 된다.
옵셔널 타입인 myName 안에 값이 없기 때문에 조건문이 실행되지 않는 것을 확인할 수 있었다.
이런 이유에서 옵셔널 바딩딩을 통해 nil 체크를 할 수 있고 안전하게 값을 가져오는 지 알 수 있었다.
추가로 콤마(,) 를 통해서 여러 개의 옵셔널을 바인딩 할 수 있다.
myName = "jaynam"
yourName = nil
if let name = myName, let friend = yourName {
print("\(name) and \(friend)")
}
// yourName 의 값이 nil 로 값이 나오지 않는다.
yourName = "Su"
if let name = myName, let friend = yourName {
print("\(name) and \(friend)")
}
// myName 과 yourName 의 값이 있기 때문에 jaynam and Su 라는 값을 출력할 수 있다.
콤마(,) 를 통해서 and 연산을 해줄 수 있는데 yourName의 값이 nil 이기 때문에 아무것도 출력되지 않는다.
따라서, yourName 에 값이 들어있다면 조건문 안의 내용을 실행하게 된다.
강제 추출 | Force Unwrapping
옵셔널의 값을 강제로 추출
말 그대로 옵셔널 안에 값이 있는지 없는지 모르는 상태에서 강제로 값을 꺼내는 방식이다.
값이 없을 경우 런타임 오류가 발생하기 때문에 옵셔널 바인딩을 통해 옵셔널의 값을 꺼내는 것을 추천한다.
정말 옵셔널 바딩인으로 값을 꺼내기 귀찮거나 로직상 nil 값이 들어가지 않아 오류가 발생하지 않을 것이라는
확신이 들지 않는 이상 안 쓰는게 좋다고 생각한다.
추가적으로 옵셔널 체이닝에 대해서도 적어보았다.
옵셔널 체이닝 | Optional Chaining
옵셔널 체이닝은 옵셔널 요소 내부의 프로퍼티로
옵셔널의 값이 있는지 연속으로 확인하면서 중간에 하나라도 nil 의 값이 있다면 nil 이 반환되는 형식이라고 한다.
이렇게만 들었을 때는 잘 이해가 되지 않았다. 그래서 예제를 통해서 확인해보았다.
옵셔널 체이닝에 대한 부분은 배열을 통해서 어떻게 사용하는지 확인해볼 수 있었다.
let array: [String]? = []
if let array = array, array.isEmpty {
print("array is Empty !")
} else {
print("array is not Empty !")
}
배열이 비어있는지 아닌지 위와 같이 조건문을 통해 확인할 수 있다.
이때, 옵셔널 체이닝을 사용하면 더 간단하게 확인할 수 있다.
let isEmptyArray = array?.isEmpty == true
옵셔널 타입의 array 가 옵셔널 안의 값이 있는지 아닌지 확인한다.
그리고 나서 배열이 비어있는지 확인하게 된다.
배열 안에 값을 추가하면 다음과 같이 확인할 수 있다.
array?.append("jaynam")
let isEmptyArray = array?.isEmpty == true
print(isEmptyArray)
// false 라는 결과를 출력한다.
값을 추가해주었고 배열 안에 값이 있기 때문에 false 를 출력한다.
array?.isEmpty 의 값으로는 nil, true, false 의 값을 가져올 수 있다.
isEmpty 는 Bool 타입을 가지는데 옵셔널 체이닝을 통해서 Bool? 타입을 반환하게 된 것이다.
옵셔널 체이닝을 사용하지 않는다면 하나하나 확인해나가야 한다.
그런데 옵셔널 체이닝을 사용한다면 연속적으로 확인할 수 있게 해준다.
연속적으로 확인하면서 nil 의 값을 가지면 nil 의 값을 반환하기 때문에 멈추게 된다.
그리고 옵셔널 체이닝은 옵셔널의 타입을 반환한다는 것을 알아두자.
옵셔널에 대해서 아직 제대로 이해한 것이 아니기 때문에
계속해서 접해보면서 익숙해져야 할 것 같다😵
- 참고 사이트 -
www.edwith.org/boostcamp_ios/lecture/11270
devxoul.gitbooks.io/ios-with-swift-in-40-hours/content/Chapter-2/optionals.html
yagom.github.io/swift_basic/contents/16_optional_chaining/
'iOS > Swift' 카테고리의 다른 글
[Swift] 13. 클래스(class) 기본 (0) | 2020.10.20 |
---|---|
[Swift] 12. 구조체(struct) 기본 (0) | 2020.10.18 |
[Swift] 10. 옵셔널 (Optional) (0) | 2020.09.23 |
[Swift] 9. 반복문 (for-in, while, repeats-while) (0) | 2020.09.16 |
[Swift] 8. 조건문 (0) | 2020.09.16 |