Optionals

작성일

Optionals

  • 값이 있을수도 있고, 없을수도 있다.
  • 값이 있다.
    0 -> 다쓴 상태인 값.
  • 값이 없다.
    nil -> 아예 값이 없는 것.
ex) 값이 없는 상태 체크에 0을 넣으면 -> 틀린 로직이다.
var myAge: Int = 0
if myAge == 0 {
  //alert - 나이를 입력해 주세요.
}

따라서

var myAge: Int? = 0
if myAge == nil {
  // alert - 나이를 입력해 주세요.
}

이런 방식으로 사용해야 한다.
비슷한 느낌으로

var myName: String? = " " //빈스트링
if myName == ""{
  //이름을 입력해주세요.
}

위에 예제는 틀린 예제이고,

var myName: String? = " "
if myName == nul {
  //이름을 입력해주세요.
}

이런 방식이 맞는거다.


옵셔널은 그냥 사용할 수 없는 경우가 많이 있다.
ex)

var a = 10  
var b = 20  
  
var c = a + b

이건 잘 작동하지만,

var a: Int? = 10  
var b: Int? = 20  
  
var c = a + b

이렇게 사용하려고하면 작동하지 않는다 그이유는
// Int? -> Int
// String? -> String 이런식으로 unwrapping을 해야하기 때문이다.
이럴때 쓰는 문법이 따로 있는데 그게 바로, coalesce 이다.

coalesce

예를들어,

var c = (a ?? 0)

이런방식으로 사용하는 것이다 이게 하나의 문법인데,
a라는 값이 있으면 그값을 사용하는데 없으면 0으로 대체해서 사용하는 것이다.
따라서,

var a: Int? = 10  
var b: Int? = 20  
  
var c = (a ?? 0) + (b ?? 0)

이렇게 해야 잘 작동이 된다.

force unwrap(강제로 변경한다)

var d = a! + b!

이렇게 사용해야한다. !란 a라는 값이 무조건 있는 상태로 가정하고 사용하는 것이다.
만약에 없이 사용한다고 치면, 그냥 앱 자체가 죽어버리고 변수가 망가진다.
즉, 무조건 값이 있다고 생각하고 사용해야한다.


var a: Int? = 20
if a != nul {
  print(a)
}

의 출력값은 Optional(20)이고,

if let hasNumber = a {
  print(hasNumber)
}

의 출력값은 20이다. 그 이유는 let이라는 unwrapping을 하는 문법이 들어있어서이다. var로 할수도있다.

if var hasNumber = a {
  hasNumber = hasNumber * 2
  print(hasNumber)
}

let은 상수라서 값을 변경못하는데 var는 변수라서 값을 변경할수 있다.
따라서 변경해서 사용하고싶으면 var를 써야한다.


guard let

guard 안에 값이 있으면 그 값을 출력하지만, 그값이 없으면 아예 출력 자체를 하지 않는다.

var a: Int? = 20

func testFunc(){
  guard let hasNumber = a else {
    return
  }
  print(hasNumber)
  print("end")
}

20이 있으므로 출력값은

20
end

가 나오고 만약 위에 20을 지우면 출력값자체가 나오지 않는다. 그 이유는 값이 없기 때문에