Swift- Optional unwrapping

아토시스·2023년 8월 21일
1

Swift

목록 보기
3/14

swift에는 optional 이라는 변수 타입이 있다. 있을지 없을지 모르는 값을 표현하기 위한 방법이다.(React에도 있는 개념이라 마냥 낯설지는 않은듯 ..?ㅎㅋ )

어떤 값을 변수에 저장하려고 하는데 그 값이 변수를 선언하는 시점에 있을지 없을지 모르는 경우타입명 뒤에 ?(물음표)를 붙여서 표현한다.
(swift는 처음 변수 선언시 nil 값이 들어가는 것을 허용하지 않기 때문에..)

이렇게 optional 변수를 쓰는 경우에는 그 값 자제가 optional로 표현이 된다. 따라서 이를 풀고 그 안에 넣어진 값에 접근할 수 있는 3가지 방법이 있다.


1. Forced unwrapping

이 방법은 강제 언랩핑 방식으로 사용하고자 하는 optional 변수명 뒤에 !를 붙여 접근하는 방식이다.

print(carName!) // 결과: carNmae

하지만 이 방법은 carName의 값이 없는 경우(nil) 에러가 발생한다.(절대 추천x)

2. Optional binding

2-1. if let

조건을 줘서 wrap 되어있는 것을 벗기는 방법이다.( = 옵셔널을 벗기는 것.)

2-2. guard

값이 없는 경우 return 시켜버린다.
(_ 는 인수를 사용하지 않을경우 사용할 때 대신 쓸 수 있다.)

3. Nil coalescing

이 방식은 값이 없는 경우에 그냥 기본 타입 변수를 지정해 주는 방식이다.


📍 예제 )

(1) 문자열을 받아서 숫자로 변경하여 출력하기


fun printParsedInt(from: String) {
	guard let num = Int(from) else {
    	print("Int로 변환할 수 없는 문자입니다.")
        return
    }
    
    print(num)
}

printParsedInt(from: "100")

문자열을 Int 타입으로 변환하는 경우 해당 문자열이 변환이 될 수도 있고 , 안될 수도 있기 때문에 Int(from)은 optional 타입이다. 따라서 이를 guard let 방식을 통해 unwrapping 하여 표현할 수 있다.

(2) 문자열을 받아서 합을 구해 출력하기

import Foundation

let input = readLine() // 입력 값: 3 5

func printAddNum(input: String?) {
    if let nums = input {
        print(nums) // 결과: 3 5
        let arr = nums.split(separator: " ").map{ Int($0)! }
        print(arr) // 결과: [3, 5]
        print(arr[0] + arr[1]) // 결과: 8
    }
}

printAddNum(input: input)

swift의 경우 키보드 입력을 받기 위해 Foundation을 import하고 readline()으로 입력 값을 받아온다. 입력이 있을 수도 있고 , 없을 수도 있기 때문에 처음 input 값은 optional 변수가 된다.

  1. 이 값을 공백(" ")을 기준으로 2개의 값으로 나누면 ["3","5"] 형태로 변환이 된다.

  2. 이 변환된 값을 바로 map을 통해 Int로 변경하게 되는데 이때 문자열이 Int로 변경될 수도 있고 , 안될 수도 있기 때문에 역시 한번 더 !(느낌표)를 통해 unwrapping을 해줘야 비로소 [3,5] 형태로 arr 변수에 값이 담기게 된다.

    * map에서 Int($0)!의 $0은 인자 하나를 의미한다.
    이 개념은 closure 개념이므로 closure 공부할 때 자세히 살펴봐야할 거 같다.
profile
오늘보다 더 나은 내일이 되길 바라며

0개의 댓글