나의 발자취
옵셔널 언래핑 Optional Unwrapping 본문
옵셔널 추출 네가지
1. 강제추출(Forced Unwrapping) (!) 값이 있다는 것이 확실할 때 사용
var str: String? = "안녕하세요"
print(str!)
nil일 때 forced unwrapping을 하면 에러가 난다.
2. if문으로 nil 아닌지 확인 후 강제로 벗기기
if str != nil {
print(str!)
}
3. 옵셔널 바인딩 (if let 바인딩)
만약 바인딩이 된다면, 특정 작업을 하겠다는 의미이다.
if let s = str { // str에 있는 값이 s라는 상수에 바껴서 담긴다면(nil값이 아니라면). 만약 nil이라면 담기지 않는다!
print(s)
}
str: Optional String
s: String
+실제 앱을 만들 때 guard let 바인딩을 많이 사용한다.
func doSomething(name: String?) {
guard let n = name else { return } // name에는 optional String인 "hello"가 담겨있음.
print(n)
}
doSomething(name: "hello")
guard문 안에서 선언한 변수 n은 아래 문장에서도 사용할 수 있다. (동일한 scope로 취급)
+if var도 가능은 하지만 이것을 사용하는 경우는 없다. 값을 벗기면 그 값을 사용하게 되고(당연히 사용하려고 언래핑을 하게 되는 것), 그것을 다시 바꾸는 경우는 없기 때문.
4. Nil-Coalescing 연산자(??) 사용
코어레싱(coalesce): 더 큰 덩어리로 합친다는 뜻
옵셔널 타입에 대하여, 디폴트(기본)값을 제시할 수 있을 때 사용한다. (직접 값을 벗겨서 사용하는 것은 아니고, 디폴트값 제시를 통해 옵셔널 가능성을 없애는 방법)
default값을 제시하므로 nil이 나올 수가 없다. 그러므로 아래의 경우에는 userName 변수는 String타입이 된다.
var serverName: String? = "홍길동"
var userName = serverName ?? "미인증사용자" // -> "미인증사용자"라는 디폴트값이 있으므로 String타입
var hello = "인사하겠습니다. " + (str ?? "Say, Hi")
print(hello) // 인사하겠습니다. 안녕하세요
str = nil
print(str ?? "Say, Hi") // 인사하겠습니다. Say, Hi
// 백그라운드 기본 색상이 선택이 안되어 있으면 ====> 회색
Comments