swift에는 optional 이라는 변수 타입이 있다. 있을지 없을지 모르는 값을 표현하기 위한 방법이다.(React에도 있는 개념이라 마냥 낯설지는 않은듯 ..?ㅎㅋ )
어떤 값을 변수에 저장하려고 하는데 그 값이 변수를 선언하는 시점에 있을지 없을지 모르는 경우에 타입명 뒤에 ?(물음표)를 붙여서 표현한다.
(swift는 처음 변수 선언시 nil 값이 들어가는 것을 허용하지 않기 때문에..)
이렇게 optional 변수를 쓰는 경우에는 그 값 자제가 optional로 표현이 된다. 따라서 이를 풀고 그 안에 넣어진 값에 접근할 수 있는 3가지 방법이 있다.
이 방법은 강제 언랩핑 방식으로 사용하고자 하는 optional 변수명 뒤에 !를 붙여 접근하는 방식이다.
print(carName!) // 결과: carNmae
하지만 이 방법은 carName의 값이 없는 경우(nil) 에러가 발생한다.(절대 추천x)
조건을 줘서 wrap 되어있는 것을 벗기는 방법이다.( = 옵셔널을 벗기는 것.)
값이 없는 경우 return 시켜버린다.
(_ 는 인수를 사용하지 않을경우 사용할 때 대신 쓸 수 있다.)
이 방식은 값이 없는 경우에 그냥 기본 타입 변수를 지정해 주는 방식이다.
(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 변수가 된다.
이 값을 공백(" ")을 기준으로 2개의 값으로 나누면 ["3","5"] 형태로 변환이 된다.
이 변환된 값을 바로 map을 통해 Int로 변경하게 되는데 이때 문자열이 Int로 변경될 수도 있고 , 안될 수도 있기 때문에 역시 한번 더 !(느낌표)를 통해 unwrapping을 해줘야 비로소 [3,5] 형태로 arr 변수에 값이 담기게 된다.
* map에서 Int($0)!의 $0은 인자 하나를 의미한다.
이 개념은 closure 개념이므로 closure 공부할 때 자세히 살펴봐야할 거 같다.