한결과 레지아이스

TIL in Swift about Optional, 22/02/16 본문

Today I Learned/SwiftUI

TIL in Swift about Optional, 22/02/16

miniwho 2022. 2. 16. 23:40

Today I learned about Optional!

Swift에서는 변수에 값이 없다는 것을 표기하기 위한 방법이 존재하는데, 이걸 optional이라고 한다.

변수를 사용하다 보면 아예 값이 없는 경우가 필요할 때가 있고, 이게 0으로 표현하긴 부족할 때가 있다.

이럴 때 optional을 통해 nil이란 값을 넣어준다..

1. Optional이란?

선언은 다음과 같이 한다.

var iAmOptionalInteger: Int?

자료형 뒤에 ?를 붙여주면 된다! 귀엽다.

초기화해주지 않아도 nil로 초기화된다.

var iAmOptionalInteger: Int? = nil

두 코드가 같다고 봐도 된다.

이런 변수들은 그냥 쓰면 에러가 나기 때문에, 옵셔널 추출이란 걸 해줘야 쓸 수 있다.

var iAmOptionalInteger: Int? = nil
var giveMeAValue: Int

giveMeAValue = iAmOptionalInteger // 여기서 에러가 난다.

왜냐? giveMeAValue라는 변수는 nil을 담을 수 없기 때문이다.. 근데 iAmOptionalInteger변수가 nil이 아니고 값을 가지고 있어도 에러는 난다.

value of optional type 'Int?' must be unwrapped to a value of type 'Int' giveMeAValue = iAmOptionalInteger

replit에서 실행시켜봤을때 대충 이런 에러가 난다. iAmOptionalInteger를 nil이 아닌 값으로 초기화해줘도 같다.

결국 옵셔널 변수를 사용하려면 unwrap이라는 것을 해줘야 하나보다.

호기심이 동해서

var iAmOptionalInteger: Int?
var giveMeAValue: Int? = 1

giveMeAValue = iAmOptionalInteger

print(giveMeAValue)

이런 것도 실행해봤는데, 경고를 잔뜩 띄우지만 nil을 출력하긴 하더라..

2. unwrap은 어떻게 할까요??

그것이 문제였습니다...

방법이 여러가지가 있어서 더 어려운 것 같다..

  • 강제 추출
var iAmOptionalInteger: Int?
var giveMeAValue: Int

giveMeAValue = iAmOptionalInteger!

이렇게 변수 뒤에 !를 붙이면, nil이 아닌 경우에 값을 꺼내어준다.

그럼 nil이면??

런타임 에러가 난다.. 실제로 프로그램에 사용하는 것은 지양해야 하고, 개발 중에는 터지는 부분을 확인할 수 있어 유용하다고 들었다.

  • 옵셔널 바인딩

왜 바인딩이라고 부르는지 잘 모르겠지만..

var iAmOptionalInteger: Int?
var giveMeAValue: Int

if let temporary = iAmOptionalInteger {
	giveMeAValue = temporary
} else {
	giveMeAValue = 0
}

위 코드의 경우, iAmOptionalInteger를 임시로 temporary에 할당해주어서 쓴다. 이름이 굳이 temporary일 필요는 없다. 이 let은 해당 {} 안에서만 쓸 수 있다. if문을 벗어나선 쓸 수 없고 당연히 else문에서도 쓸 수 없다.

nil이라면 else문으로 가서 코드블럭 안의 내용을 실행한다.

  • nil 병합

이것도 왜 이름이 병합인지 모르겠다..

var iAmOptionalInteger: Int?
var giveMeAValue: Int

giveMeAValue = iAmOptionalInteger ?? 0

옵셔널 바인딩 부분의 코드와 같은 결과를 낸다.

iAmOptionalInteger가 값을 가진다면 그것을, 아니라면 “??” 뒤의 값을 giveMeAValue에 준다.

이게 더 편해 보이는데 왜 굳이 옵셔널 바인딩을 하냐? 하면

얘는 대입만 해줄 수 있지만 바인딩에서는 if문 안에서 여러가지 더 복잡한 것들을 해줄 수 있기 때문이지 않을까..라고 짐작한다.

Comments