swift에서는 변수에 nil
이 들어가는 것을 허용하지 않는다.
하지만 변수를 선언하다보면 값이 있을 수도 있고 없을 수도(nil
)있는 변수를 선언해줘야 하는 일이 생기게 된다.
없을 수도 있는 변수(
nil
)를 선언하기 위해서Optional
키워드를 사용해야한다.
var type: String = nil //compile error
var type: String? = nil
var name: String? = "Sojin"
print(name) //Optional("Sojin")
여기서 type의 자료형은 Optional<String>
이다.
그리고 name변수를 출력하게 된다면 Optional("Sojin")
이 나올 것이다.
이러한 자료형 사용을 위해서는 Optional
에서 값을 꺼내와야한다
그리고 이러한 작업을 Optional Unwrapping
이라고 부른다.
var name: String? = "Sojin"
print(name) //Optional("Sojin")
print(name)을 할 때 Sojin만 출력되게 하기 위한
방법을 알아보자
.
..
알아보기 전에 알아야할 것이 있다면
Optional Unwrapping
을 하기위해선
Unwrapping하고자 하는 값이nil
이면 안된다.
왜냐하면 nil
의 자료형이 Optional<nil>
이 아니기 때문이다.
let a: Int? = nil
print("a : \(a)")
let b : Int? = 6
print("b : \(b)")
무조건 변수가 있는 상황이 보장된 경우 느낌표(!)를 써서 unwrapping을 해준다.
print(name!) //Sojin
주의해야할 점은 변수나 상수의 값이 nil
이면 안된다
에러가 발생한다
checks if an optional contains a value, and makes it availble as a comtemporary constant or variable.
옵셔널에 값이 포함되어 있는지 확인하고 임시 상수 또는 변수로 사용할 수 있도록 합니다.
var userName :String? = "Sojin" // 1번 경우
var userName :String? = nil // 2번 경우
if let nonOptionalUserName = userName{
print("userName : \(nonOptionalUserName)")
}else {
print("userName is nil")
}
같은 코드를 실행해주었다
1번인 경우의 결과값
userName : Sojin
2번인 경우의 결과값
userName is nil
실행과정을 봐보자면
첫번째로 보라색 userName이 nil인지 아닌지 판별한다
nonOptionalUserName
에 unwrapping한 값이 들어가게 된다.unwrapping된 nonOptionalUserName
값은
if let 구문 밖에서 사용하지 못한다는 것이다.
userName의 type은 여전히 Optional<String>
이다.
if let nonOptionalUserName = userName{
print(nonOptionalUserName)
print(userName)
}
이러한 결과값을 마주하게 된다.
var userName :String? = "Sojin" //1번인 경우
var userName :String? = nil //2번인 경우
guard let nonOptionalUserName = userName else {
print("userName is nil")
return
}
print("userName : \(nonOptionalUserName)")
1번인 경우 실행값
userName : Sojin
2번인 경우 실행값
userName is nil
실행과정을 봐보자면
첫번째로 보라색 userName이 nil인지 판별해야한다
nonOptionalUserName
에 대입해주게 되고 우리는 그 값을 guard 구문 밖에서도 사용할 수 있게된다.if let 구문과 비슷하게, nil이 아닌 경우에만 unwrapping된 값이 nonOptionalUserName
에 대입되기 때문에 괄호 안에서는 그 값을 사용할 수 없다.
Nil Coalescing
은 한글로 "nil 병합 연산"이라고도 부른다
값이 없는 경우에 기본 타입 변수를 지정해주는 방식이다.
var userName :String? = nil
print("userName : \(userName ?? "소진")")
userName ?? "소진"
이 부분을 뜯어보자
userName
을 unwrapping했을 때 nil
이 아닌 경우
?? 앞에 있는 값을 넣어주게 된다.
만약 userName
을 unwrapping했을 때 nil
이 나오게 되면
?? 뒤에 있는 "소진"이 값으로 들어가게 된다
참고
https://babbab2.tistory.com/16
https://babbab2.tistory.com/17?category=828998
https://velog.io/@devapploper/Nil-coalescing
https://developerbee.tistory.com/12