DevCho
Developer Blog
DevCho
반응형
전체 방문자
오늘
어제
  • 분류 전체보기 (48)
    • IOS (31)
      • Xcode (7)
      • Assets (1)
      • Swift (20)
      • UI (1)
      • SwiftUI (1)
      • Build (1)
    • Flutter (4)
      • Install (4)
      • Dart (0)
    • Rust (0)
    • 유용한 사이트 소개 (1)
    • 개발자의 아이템 (1)
    • Terminal (1)
    • Mac (2)
    • Git (1)
    • 회고 (1)
    • Java (2)
      • Java 기본 사용법 (2)
      • Collections (0)
    • 개발자의 글쓰기 (0)
    • 디자인 패턴 (1)
    • JavaScript (2)
    • Kotlin (1)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • func
  • flutter 설치
  • flutter dart
  • MAC
  • 제어문
  • 스위프트
  • swift random
  • nil
  • Xcode Theme
  • IOS
  • dart 설치
  • Storyboard
  • CLASS
  • optional
  • chocolatey 설치
  • xcode13
  • dart
  • flutter
  • Dark mode
  • Swift
  • flutter install
  • Terminal
  • 플러터 설치
  • chocolatey
  • xcode
  • random number
  • struct
  • chocolatey install
  • SwiftUI
  • Java

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
DevCho

Developer Blog

[Swift] Optional을 다루는 다양한 방법 : nil 다루기
IOS/Swift

[Swift] Optional을 다루는 다양한 방법 : nil 다루기

2021. 12. 19. 11:30
반응형

Optional을 다루는 것이 필요한 이유

nil 이 가능한 타입을 다루기 위해서 Swift는 Optional을 사용한다. 하지만 Optional로 값이 오게 되면 Optional로 감싸여 있어 그 안에 있는 값을 사용하기 위해서는 Optional을 제거해야 한다.

 

이번 글에서는 다음의 dictionary를 사용해 Optional 타입의 변수가 들어왔을 때 어떻게 처리해야하는지에 대해 알아볼 것이다.

let dictionary : [String : Int] = ["A" : 0, "B" : 1, "C" : 2]

 

! 을 이용한 옵셔널 강제 제거

첫 째로 !을 이용해 Optional을 강제 제거하는 방법이 있다.

 

예를 들어 아래와 같이 dictionary에서 값이 Optional로 오는 상황을 가정해보자.

 

그림1. !을 사용한 Optional 강제 제거1

 

dictionary에서 값을 받아올 때 !을 사용하면 Optional이 강제로 제거된다. 

그림2. !을 사용한 Optional 강제 제거2

 

!을 사용한 옵셔널 강제 제거의 한계점

'강제'라는 어감에서도 볼 수 있듯이 코드를 짤 때는 자주 사용하면 언제 오류가 발생할지 모르는 코드가 되어버린다. 특히 !는 nil이 아님을 단언하는 것인데, nil이 발생해버리면 프로세스가 죽어버린다. 

 

위의 dictionary에 없는 Key 값인 "D"를 사용해 변수를 얻어온다음 !을 사용해보면 다음과 같이 Fatal Error가 발생하는 것을 확인할 수 있다.

그림3. !을 사용한 Optional 강제 제거의 한계점

 

따라서 !은 사용을 지양하는 것이 좋으며, 간단히 사용해야 할 경우를 제외하고는 사용하지 말도록 하자.

 

 

?? 을 이용해 Optional 풀릴 때의 default value 설정하기

Optional을 다루는 두 번 째 방법은 '??'을 이용해 Optional로 감싸진 값이 nil일 때 default value로 대체하는 방법이다. '??' 뒤에 Default Value를 씀으로써 Optional로 감싸진 값이 nil일 때 어떤 값으로 대체할 지를 지정할 수 있다. 

let aValue = dictionary["A"] ?? default value

 

위와 같이 쓰면 aValue 값에서 바로 Optional이 풀린다. 예를 들어 아래와 같이 INVALID VALUE 값을 -1로 둔다음 Optional 내부의 값이 nil일 때 대체하도록 만들면 "A"에 해당하는 값인 0이 나오는 것을 확인할 수 있다.

그림4. '??'를 사용한 Optional 풀릴 때 기본값 설정1

위 그림3에서 "D" 를 Key 값으로 써서 Optional 내부를 nil로 만들었던 상황을 보자. aValue 값을 프린트 해보면 -1이 나오는 것을 확인 할 수 있다. Optional(nil)이 옵셔널이 풀리면서 -1로 대체되었기 때문이다.

그림5. '??'를 사용한 Optional 풀릴 때 기본값 설정2

 

if를이용해 Optional이 nil이 아닐 때 수행될 블록 만들기

위의 두 방법 모두 한계점이 있다. Optional 내부에 nil 값이 왔을 때 오류가 생기거나, default value로 설정되어 사용된다는 점이다. Swift에서는 이에 대해 Optional 내부의 값이 nil값이 아닐 때만 수행될 수 있는 블록을 만드는 하는 문법을 제공한다.

 

Swift에서는 if let이나 if var 을 사용해 변수를 선언하고 해당 변수의 값이 nil이 아닐 때만 Optional이 풀린 값이 변수에 저장되게 하여 if블록 내부가 실행될 수 있도록 해준다. 

 

예를 들어 아래와 같이 사용되면 aValue가 null이 아닐 때만 블록 내부의 작업이 사용되게 된다.

if let aValue = dictionary["A"] {
    //aValue에 대해 수행할 작업 작성
}

 

실제 사용을 보자. Dictionary에 "A" 키는 0에 대응되므로 aValue의 값이 nil이 아니다. 따라서 0이 출력되는 것을 확인할 수 있다.

그림6. if 사용1

 

하지만 다음과 같이 Dictionary에 대응되는 값이 없는 "D"를 넘기면 no value가 출력되는 것을 확인할 수 있다.

그림7. if 사용2

반응형

'IOS > Swift' 카테고리의 다른 글

[Swift 제어문] switch case 사용해 다중 조건 처리하기  (0) 2021.12.19
[Swift 제어문] if 문 다루는 방법 한 번에 정리하기  (0) 2021.12.19
[Swift] nil 과 Optional 이란 무엇인가?  (0) 2021.12.19
[Swift] suffled 사용해 Array 순서를 랜덤으로 바꾸기  (0) 2021.12.09
[Swift] Random 값을 뽑아내는 다양한 방법 : Random 숫자, Collection Random 값 뽑기  (0) 2021.12.09
    'IOS/Swift' 카테고리의 다른 글
    • [Swift 제어문] switch case 사용해 다중 조건 처리하기
    • [Swift 제어문] if 문 다루는 방법 한 번에 정리하기
    • [Swift] nil 과 Optional 이란 무엇인가?
    • [Swift] suffled 사용해 Array 순서를 랜덤으로 바꾸기
    DevCho
    DevCho
    개발자의 개발 공간

    티스토리툴바