반응형
Notice
Recent Posts
Recent Comments
Link
Today
Total
07-05 05:44
«   2024/07   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
Archives
관리 메뉴

iOS 개발 기록 블로그

iOS(Swift) Optional 완벽 이해 (5단계) 본문

iOS

iOS(Swift) Optional 완벽 이해 (5단계)

crazydeer 2022. 5. 27. 11:33
반응형

Optional 이해하기 위한 5가지 단계

  1. Force Unwrapping 
  2. Check for nil value
  3. Optional Binding
  4. Nil Coalsecing Operator
  5. Optional Chaining

 

OptionalsDemo라는새로운 프로젝트 생성

let myOptional: String?


myOptional = "CrazyDeer"


let text: String = myOptional

위와 같은 코드에서 세번째 줄이 에러가 나온다.

 

Optional Error

 

text 변수는 String이지만

myOptional이라는 데이터 타입이 String?이기 때문이다.

 

 

Optional 에러 원인

 

 Optional 데이터를 사용하기 위한 방법 5가지인 것이다.

간단한 방법이 이것이다.

 

Force Unwrapping

변수 뒤에 ! 느낌표를 붙여주는 방법

 

Force Unwrapping

 

그런데 이때 myOptional 데이터를 nil 값을 줘본다.

 

 

Force Unwrapping Runtime Error

 

Xcode 상에서는 에러가 나지 않지만

실행해보면 충돌이 일어난다.

이를 '런타임 에러' 라고 한다.

 

콘솔 창의 에러 메시지

Force Unwrapping Runtime Error Message (Console)

 

 

Check for nil value

이런 런타임 에러가 나지 않게 하기 위한

안전장치로값인지 체크하는 방법이 있다.

let myOptional: String?


myOptional = nil


if myOptional != nil {
    let text: String= myOptional!
} else{
    print("myOptional was found to be nil.")
}

myOptional nil 아닌지 체크

 코드는 당연히도 else 조건에서 쓰인 문자열이 출력된다.

 

그런데 여기서 문제가 있다.

 

 장황하고 불필요해보이는 조건문을 항상 써줘야만 하고

여전히 코드 내에서 사용하기 위해서 !를 붙여줘서

강제 언래핑을 해줘야 한다.

 

 

Optional Binding

새로운 상수(constant) 생성해서 조건문 안에서

myOptional = 연산자로 대입한다.

이러면 safeOptional nil 값이 아닌지 체크하면서

바로 일반 String으로   있다.

 

Optional Binding

 

 

Nil Coalescing Operator

?? 연산자로  간결하게 사용할  있다.

해당 Optional nil이면 default value 쓰도록 하는 것이다.

 

 

Nil Coalescing Operator

 

text Optional 데이터를 대입하는데

nil coalescing operator (??)를를 사용하여

nil 경우 다음과 같은 값을 text 대입하는 방법이다.

 

그러면 Optional 데이터를 가진

Struct Class에서는 어떻게 사용할까?

struct MyOptional {
    var propertySample = 12345
    
    func methodSample() {
        print("This is a Struct's method.")
    }
}


let myOptional: MyOptional?  // struct's optional


myOptional = MyOptional()
//myOptional = nil


print(myOptional!.propertySample)

위와 같은 코드처럼 기본 구조체가 있고

let myOptional에서에서  구조체를 Optional 받아왔다.

 

마지막 줄처럼 force unwrapping  해주면 사용이 가능하지만

위에서 설명했던 것처럼

myOptional = nil  들어가면 런타임 에러가 난다.

 

Optionals of Struct or Class의 런타임 에러

 

그럼  코드를  안전하게 하기 위한 방법은 뭐가 있을까?

 

 

 

Optional Chaining

 

optional?.property
optional?.method

위와 같이 ?  붙여서 프로퍼티와 메소드를 부르는 것이다.

그러면  프로퍼티와 메소드 또는 구조체가 nil

아닐 경우에 가져오게 된다.

 

code

struct MyOptional {
    var propertySample = 12345
    
    func methodSample() {
        print("This is a Struct's method.")
    }
}


let myOptional: MyOptional?  // struct's optional


myOptional = MyOptional()
//myOptional = nil


print(myOptional?.propertySample)
myOptional?.methodSample()

 

result (Console)

Optional Chaining Result

 

 

정리

Force Unwrapping optional!
Check for nil value if optional != nil {
    optional!
}
Optional Binding if let safeOptional = optional {
    safeOptional
}
Nil Coalescing Operator optional ?? defaultValue
Optional Chaining optional?.property
optional?.method()

 

 

 

 

참고

안젤라유 강의: https://www.udemy.com/course/ios-13-app-development-bootcamp/

 

iOS & Swift - The Complete iOS App Development Bootcamp

From Beginner to iOS App Developer with Just One Course! Fully Updated with a Comprehensive Module Dedicated to SwiftUI!

www.udemy.com

 

반응형