APP/Swift

ios 개발을 위한 swift 문법 배우기: 옵셔널 값 추출

개발자 aloe 2022. 8. 25. 16:22
728x90
옵셔널 값 추출 방법 2가지

Optional Binding - 옵셔널 바인딩
Force Unwrapping - 강제 추출


Optional Binding
옵셔널의 값을 꺼내오는 방법 중 하나
nil 체크 + 안전한 값 추출

ex 인트형을 보관하는 상자를 하나 더 보호막으로 감쌓아 준다고 생각하면됨
상자안에 값이 있습니까? 있으면 추출 없으면 지나침

 

//MARK:- Optional Binding

func printName(_ name: String) {  // 일반 스트링 값 가지려고 했는데
    print(name)
}

var myName: String? = nil

//printName(myName)
// 전달되는 값의 타입이 다르기 때문에 컴파일 오류발생

그래서 if-let 방식을 통해 옵셔널 바인딩 해줄수 있음
간단하게 말하면 if문 안의 조건문의 값이 nil인가 아닌가를 체크하는 문법입니다.
조건문이 nill이 아니라면 해당 블럭이 실행되는 구조입니다.
var myName: String? = nil


if let name: String = myName {
    printName(name)
} else {
    print("myName == nil")
}


var yourName: String! = nil  // 암시적 추출 옵셔널 형식도 옵셔널 형태라 이런식으로 사용 가능함 

if let name: String = yourName {
    printName(name)
} else {
    print("yourName == nil")
}


// name 상수는 if-let 구문 내에서만 사용가능합니다
// 상수 사용범위를 벗어났기 때문에 컴파일 오류 발생
//printName(name)

 

,를 사용해 한 번에 여러 옵셔널을 바인딩 할 수 있습니다
모든 옵셔널에 값이 있을 때만 동작합니다

 

myName = "woogie"
yourName = nil

if let name = myName, let friend = yourName {
    print("\(name) and \(friend)")
}
// yourName이 nil이기 때문에 실행되지 않습니다

yourName = "hana"

if let name = myName, let friend = yourName {
    print("\(name) and \(friend)")
}
// woogie and hana         이렇게 값 할당하면 실행됨

 

 


Force Unwrapping  옵셔널 강제 추출 방법
위에 옵셔널 바인딩은 보호막에 노크해서 정중하게 가져오고 지나가는 방식이라면
강제 추출 방식은 보호막을 깨 부시고 가져오는 방법임
func printName2(_ name: String) {  // 일반 스트링 값 가지려고 했는데
    print(name)
}

var myName2: String? = "woogie"
printName2(myName2!) // woogie  이렇게하면 강제로 옵셔널 ?벗겨지고 그 안에 값이 강제로 들어감
// 즉 옵셔널 타입이 아닌 스트링 타입으로 값 넘기는게 가능함 

myName2 = nil

//print(myName2!)
// 강제추출시 값이 없으므로 런타임 오류 발생

var yourName2: String! = nil
// 이 암시적 추출 옵셔널 형식은 선언 할때  myName2! 이런식으로
// 사용 할거다라는걸 가정하고 선언 함 

//printName(yourName2) 그래서 이렇게 쓰면 yourName2! 과 똑같은거임
// nil 값이 전달되기 때문에 런타임 오류발생

// 그래서 옵셔널 강제 추출 방식은 추천 되는 방식은 아님 안전하게 옵셔널 바인딩 방법 쓰자​
728x90