[swift/iOS] Optional과 Optional Binding

11650 단어 swiftiOSiOS

Optional

swift에서는 변수에 nil이 들어가는 것을 허용하지 않는다.

하지만 변수를 선언하다보면 값이 있을 수도 있고 없을 수도(nil)있는 변수를 선언해줘야 하는 일이 생기게 된다.

없을 수도 있는 변수(nil)를 선언하기 위해서 Optional 키워드를 사용해야한다.

var type: String = nil //compile error
var type: String? = nil

var name: String? = "Sojin"
print(name) //Optional("Sojin")

여기서 type의 자료형은 Optional<String>이다.
그리고 name변수를 출력하게 된다면 Optional("Sojin")이 나올 것이다.

이러한 자료형 사용을 위해서는 Optional에서 값을 꺼내와야한다
그리고 이러한 작업을 Optional Unwrapping이라고 부른다.


Optional Unwrapping

var name: String? = "Sojin"
print(name) //Optional("Sojin")

print(name)을 할 때 Sojin만 출력되게 하기 위한
방법을 알아보자
.
..
알아보기 전에 알아야할 것이 있다면

Optional Unwrapping을 하기위해선
Unwrapping하고자 하는 값이 nil이면 안된다.

왜냐하면 nil의 자료형이 Optional<nil>이 아니기 때문이다.

let a: Int? = nil
print("a : \(a)")

let b : Int? = 6
print("b : \(b)")

  • Forced Unwrapping
  • Optional Binding
  • Nil Coalescing
    세 가지 방법을 소개하려고 한다.

1. Forced Unwrapping

무조건 변수가 있는 상황이 보장된 경우 느낌표(!)를 써서 unwrapping을 해준다.

print(name!) //Sojin

주의해야할 점은 변수나 상수의 값이 nil이면 안된다
에러가 발생한다


2. Optional Binding

if let

checks if an optional contains a value, and makes it availble as a comtemporary constant or variable.

옵셔널에 값이 포함되어 있는지 확인하고 임시 상수 또는 변수로 사용할 수 있도록 합니다.

var userName :String? = "Sojin" // 1번 경우 
var userName :String? = nil  // 2번 경우 
if let nonOptionalUserName = userName{
    print("userName : \(nonOptionalUserName)")
}else {
    print("userName is nil")
}

같은 코드를 실행해주었다
1번인 경우의 결과값

userName : Sojin

2번인 경우의 결과값

userName is nil

실행과정

실행과정을 봐보자면

첫번째로 보라색 userName이 nil인지 아닌지 판별한다

  • userName이 nil이 아닌 경우
    : nonOptionalUserName에 unwrapping한 값이 들어가게 된다.
  • userName이 nil인 경우
    : else문 실행

주의해야할 점

  • unwrapping된 nonOptionalUserName값은
    if let 구문 밖에서 사용하지 못한다는 것이다.

  • userName의 type은 여전히 Optional<String>이다.

if let nonOptionalUserName = userName{
    print(nonOptionalUserName)
    print(userName)
}


이러한 결과값을 마주하게 된다.

guard let

var userName :String? = "Sojin" //1번인 경우
var userName :String? = nil //2번인 경우 
guard let nonOptionalUserName = userName else {
    print("userName is nil")
    return
}
print("userName : \(nonOptionalUserName)")

1번인 경우 실행값

userName : Sojin

2번인 경우 실행값

userName is nil 

실행과정

실행과정을 봐보자면

첫번째로 보라색 userName이 nil인지 판별해야한다

  • userName이 nil이 아닌 경우
    : unwrapping한 값을 nonOptionalUserName에 대입해주게 되고 우리는 그 값을 guard 구문 밖에서도 사용할 수 있게된다.
  • userName이 nil인 경우
    : 괄호 안으로 빠지게 된다

주의해야할 점

if let 구문과 비슷하게, nil이 아닌 경우에만 unwrapping된 값이 nonOptionalUserName에 대입되기 때문에 괄호 안에서는 그 값을 사용할 수 없다.


3. Nil Coalescing

Nil Coalescing은 한글로 "nil 병합 연산"이라고도 부른다
값이 없는 경우에 기본 타입 변수를 지정해주는 방식이다.

var userName :String? = nil
print("userName : \(userName ?? "소진")")

userName ?? "소진"

이 부분을 뜯어보자

userName을 unwrapping했을 때 nil이 아닌 경우
?? 앞에 있는 값을 넣어주게 된다.

만약 userName을 unwrapping했을 때 nil이 나오게 되면
?? 뒤에 있는 "소진"이 값으로 들어가게 된다

참고
https://babbab2.tistory.com/16
https://babbab2.tistory.com/17?category=828998
https://velog.io/@devapploper/Nil-coalescing
https://developerbee.tistory.com/12

좋은 웹페이지 즐겨찾기