[swift/iOS] Optional과 Optional Binding
Optional
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
이라고 부른다.
Optional Unwrapping
var name: String? = "Sojin"
print(name) //Optional("Sojin")
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)")
- Forced Unwrapping
- Optional Binding
- Nil Coalescing
세 가지 방법을 소개하려고 한다.
1. Forced Unwrapping
무조건 변수가 있는 상황이 보장된 경우 느낌표(!)를 써서 unwrapping을 해준다.
print(name!) //Sojin
주의해야할 점은 변수나 상수의 값이 nil
이면 안된다
에러가 발생한다
2. Optional Binding
if let
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인지 아닌지 판별한다
- userName이 nil이 아닌 경우
:nonOptionalUserName
에 unwrapping한 값이 들어가게 된다. - userName이 nil인 경우
: else문 실행
주의해야할 점
-
unwrapping된
nonOptionalUserName
값은
if let 구문 밖에서 사용하지 못한다는 것이다.
-
userName의 type은 여전히
Optional<String>
이다.
if let nonOptionalUserName = userName{
print(nonOptionalUserName)
print(userName)
}
이러한 결과값을 마주하게 된다.
guard let
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인지 판별해야한다
- userName이 nil이 아닌 경우
: unwrapping한 값을nonOptionalUserName
에 대입해주게 되고 우리는 그 값을 guard 구문 밖에서도 사용할 수 있게된다. - userName이 nil인 경우
: 괄호 안으로 빠지게 된다
주의해야할 점
if let 구문과 비슷하게, nil이 아닌 경우에만 unwrapping된 값이 nonOptionalUserName
에 대입되기 때문에 괄호 안에서는 그 값을 사용할 수 없다.
3. Nil Coalescing
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
Author And Source
이 문제에 관하여([swift/iOS] Optional과 Optional Binding), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@bovet/swiftiOS-Optional-Binding저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)