페이지

2017년 12월 28일 목요일

8 옵셔널

- 옵셔널 타입
nil이 될 수도 있는 인스턴스는 반드시 옵셔널 타입으로 선언
옵셔널 타입으로 선언되지 않은 인스턴스는 nil이 되지 못한다.

- 옵셔널 바인딩
어떤 옵셔널에 값이 있는지 판단할 수 있는 유용한 패턴
if let temporaryConstant = anOptional{
      // temporaryConstant로 어떤 일을 한다
} else {
     // anOptional에는 값이 없다. 즉, anOptional은 nil이다.
}

import Cocoa

var errorCodeString: String?
errorCodeString = "404"

if let theError = errorCodeString {
   print(theError)
}

- 암묵적으로 언래핑된 옵셔널(implicitly unwrapped)

import Cocoa
var errorCodeStrig: String!
errorCodeString = "404"
print(errorCodeString)
여기서 옵셔널은 암묵적 언래핑을 나타내는 !가 붙어 선언되었다. 그리고 암묵적으로언래핑핀 오셔널을 사용한다는 것은 옵셔널을 명시적으로 언래핑하여 사용하는 것보다 훨씬 더 강한 확신, 즉 값이 있다는 확신의 방증이므로 조건문도 과감하게 없앴다.

- 옵셔널 체이닝(optional chaining)
옵셔널 바인딩처럼 어떤 옵셔널에 값이 있는지 판단

import Cocoa

var errorCodeString : String?
errorCodeString = "404"
var errorDescription: String?
if let theError = errorCodeString, let errorCodeInteger = Int(theError), errorCodeInteger == 404 {
   errorDescription = "\(errorCodeInteger + 290): resource was not found."
}

var upCaseErrorDescription = errorDescription?.uppercased()
errorDescription


- 옵셔널을 준비된 상태로 수정하기
새 변수나 상수를 만들지 않아도 되도록 옵셔널을 준비된 상태(in place)로 수정할 수도 있다. 다음처럼 upCaseErrorDescription에 append(_:) 메소드를 호출한다.

...
upCaseErrorDescription?.append( "PLEASE TRY AGAIN.")
upCaseErrorDescription

옵셔널에 값이 있을 때는 텍스트를 추가만 하면되고, 값이 없다면 할 일도 없는 것이다.

- nil 결합 연산자
옵셔널을 처리할 때는 (옵셔널에 값이 있을 때) 값을 가져오거나 옵셔널이 nil일때 기본값을 사용하는 것이 일반적이다. 이를테면 errorDescription에 담긴 오류 정보를 가져올 때 문자열에 오류가 없다면 "No error"라는 기본값을 사용할 수 있다. 이때 필요한 것이 옵셔널 바인딩이다.

let description : String
if let errorEscription = errorDescription{
   description = errorDescription
} else {
   description = "No error"
}

nil 결합 연산자 사용하기
let description = errorDescription ?? "No error"
??의 왼쪽에는 옵셔널이 와야한다.왼쪽 옵셔널이 nil이면 ??는 오른쪽 값을 리턴한다. 왼쪽 옵셔널이 nil이 아니면 옵셔널에 포함된 값이 리턴된다.



댓글 없음: