[SWIFT]Optional 존재

힐링힐링·2023년 9월 1일
0

SWIFT 문법

목록 보기
1/26

SWIFT 를 처음 배우면서 Obtional 이라는 예상하지 못한 존재를 만나서 골머리좀 썼다.

Optional 이란?

형변환 과정에서 값이 있을 수도 없을수도있기때문에 ..ㅇ철수??

값이 없는 경우에 옵셔널 (optionals) 을 사용합니다. 옵셔널은 2가지 가능성이 있습니다: 값이 있고 옵셔널을 풀어서 값에 접근하거나 값이 없을 수도 있습니다.

상황

result 값 int 형으로 생성하고, 배열에 값을 Int 형으로 만들어서 넣어주는 상황이다.

let input = readLine()!

var result : Int = 0
//input.split(separator: "")
var arr  = String(input).split(separator: " ")

for i in arr {
    result = Int(i)
    print(result)
    
}

이렇게 코딩하면 암시적 강제 표현식 어쩌구 저쩌구 뜬다.
이는 배열을 Int 로 변환 하는 과정에따라 Int 값일수도 아닐수도 있기 때문이다.

Expression implicitly coerced from 'Int?' to 'Any'

그렇기에 result 값을 선언할때 "?" 를 넣어준다.

var result : Int? = 0

이상태에서 77 77 7777 띠용요요용 을 input 값을 맥이면 결과는

Optional(77)
Optional(77)
Optional(7777)
nil

"띠용요요용"은 int형으로 변환 할 수 없기에 nil
"77"은 Int로 변환 가능하기에 Optional(77)이다.
왜냐하면... swift는 이놈에 안정성 때문에 77이 int가 아닐 수도 있어서 Optional(77)로 된거다.
이걸 흔히 Wrapping(감쌈)되었다고 한다.

근데 우린 Optional(77)이 아니라 77 출력값을 보고싶다.

방법1 Forced Unwrapping

그렇기에 Forced Unwrapping 해야한다.
얼마나 Wrapping되어 있으면 "Forced"까지 붙일까??
Forced Unwapping 하는 법은 간단하다.
결과값 뒤에 느낌표 "!" 붙이면된다

let input = readLine()!

var result : Int? = 0
//input.split(separator: "")
var arr  = String(input).split(separator: " ")

for i in arr {
    result = Int(i)
    print(result!)
    
}

Optional(77)은 77로 잘 반환되는데 "띠용요요옹" 반환 안된다.

77
77
7777
Fatal error: Unexpectedly found nil ..어쩌구 저쩌구

방법2 Optional Binding

이경우 Optional Binding를 사용한다.
Optional Binding는 직역하면 옵셔널 인거를 묶는다?
if let 을 사용하는데 예시를 보자

if let 변수명 = Optional 변수 {
 // 임시 변수에 Optional 변수의 value값이 할당됩니다.
}

문제에서 Optional Binding를 사용하면,

let input = readLine()!

var result : Int? = nil
//input.split(separator: "")
var arr  = String(input).split(separator: " ")

for i in arr {
    result = Int(i)
    
    //Obtional Bingding
    if let Number = result {
        print(result!)
    }else{
        print("\(i) 는 걸러내자")
    }
    
}

input 값으로 77 77 7777 띠용요요용 를 넣었을때 결과값은

77
77
7777
띠용요요용 는 걸러내자

알면 알수록 신기한 swift ! 끝.

profile
블로그 이전합니다 https://james-kim-tech.tistory.com/

0개의 댓글