728x90
반응형

옵셔널 어떻게 꺼내서 활용하고 어떻게 사용할 수 있는지 공부해봤다.

옵셔널의 값을 꺼내는 방법에는 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

 

[LECTURE] 12. 옵셔널 추출 (💎생각해보기) : edwith

생각해보기   ▶정말 꼭 필요한 경우에 한하여, 자신이 책임질 수 있는 상황이 아니라면 옵셔널 강제추출을 사용하지 않겠노라 다짐하는 글을 미래의 나에게 한문장씩 남겨봅시다.   +... - 부스

www.edwith.org

zeddios.tistory.com/16

 

swift3 ) Optional 개념 정리

안녕하세요 :) 오늘은 Optional이 뭔지에 대해 정리해볼려고해요. 이것도 yagom님이 BoostCamp강의에서 설명을 엄청 잘해주셨답니다 :) yagom님 강의를 토대로 추가할 부분은 추가해가면서 정리해볼게요

zeddios.tistory.com

roeldowney.tistory.com/13

 

[Swift] Optional

공부하고 정리할 내용 - 옵셔널 (Optional) - 옵셔널 추출 (Optional Unwrapping) - 옵셔널 체이닝 (Optional chaining)과 빠른 종료 (Early Exit) - 옵셔널 패턴 (Optional Pattern) 옵셔널 (Optional) 옵셔널은..

roeldowney.tistory.com

devxoul.gitbooks.io/ios-with-swift-in-40-hours/content/Chapter-2/optionals.html

 

옵셔널 (Optional) · 40시간만에 Swift로 iOS 앱 만들기

 

devxoul.gitbooks.io

yagom.github.io/swift_basic/contents/16_optional_chaining/

 

옵셔널 체이닝

야곰의 스위프트 기본 문법 강좌입니다.

yagom.github.io

 

728x90
반응형

'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
복사했습니다!