-
OptionalI'm a Developer/iOS & macOS 2017. 10. 9. 20:51
Optional과 친해지기
어떤 값이 있거나(not nil) 어떤 값도 없거나(nil)
구현에 대한 정의는 다음과 같이 enum을 써서 정의할 수 있다. (Optional은 단지 enum이라고 생각하자.)
enum Optional<T> { // T는 어떤 타입도 될 수 있는 Generic 타입이다. case None case Some(T) }
즉, None일 때는 아무 값도 없는 nil인 상태이고, Some(T)는 Optional이 무엇인가 값이 있는 상태인 것이다. "무엇인가 값이 있다는 사실" 만으로 Optional에 있어서 nil과 반대되는 하나의 값이 되는 것이다.
위의 정의를 활용한 예제 코드이다.
let x: String? = nil // 1 let x = Optional<String>.None // 1' let x: String? = "hello" // 2 let x = Optional<String>.Some("hello") // 2' var y = x! // 3 switch x { case Some(let value): y = value // x 값이 있다면 3번 라인의 코드에서 x가 Unwrapping되면 y에 value값이 들어간다. case None: // 하지만 x에 아무런 값이 없는 nil 상태이면, 3번 라인의 코드에서 nil에 대해 exception을 뿜어내게 될 것이다. }
Optional을 좀 안전하게 사용해 봅시다.
다음과 같이 Optional value x에 대해서 안전하게 처리하기 위해서 if let 구문을 사용한다.
let x: String? = ... if let y = x { // y값에 x가 대입되어 사용할 수 있다. } // 위 코드는 아래처럼 생각할 수 있다. switch x { case .Some(let y): // y값에 x가 대입되어 사용할 수 있다. case .None: break // nil에 대해 exception을 뿜지 않는다. }
Optional 속에 Optional 속에 Optional 속에 Optional 속에 ... (Optional Chaining)
var display: UILabel? if let label = display { if let text = label.text { let x = text.hashValue // ... } } // 위보다 아래쪽의 코드가 더 편할 것이다. if let x = display?.text?.hashValue { // 중간에 nil값이 있다면 그냥 nil을 x에 넣고, 여기 {}안에는 보지않고, 건너뛴다. // .... (참고로 여기서 x는 Optional이다.) }
Operator -> "너가 nil이라면 무조건 default로 이 녀석을 선택하겠다."
??연산자는 A ?? B 와 같은 형식으로 사용한다. 여기서 A는 Optional 변수이다. "A가 nil일 때는 B를 기본 값으로 사용하겠다." 라는 의미이다.
let s: String? = nil if s != nil { display.text = s } else { display.text = " " }
s가 nil이라면 display.text에 빈칸 한 개가 들어가고 diplay.text가 nil이 아니면 s를 대입한다.
'I'm a Developer > iOS & macOS' 카테고리의 다른 글
Xib(Nib)으로 outlet변수를 연결할 때, 크래시가 발생하는 현상 (0) 2020.01.15 [CocoaPods Library pod repo push 에러] The validator used Swift 3.2 by default because no Swift version was specified. (0) 2019.04.04 Git 초기 설정하기. (iOS 앱개발 프로젝트) (4) 2018.05.07 Outlet 변수와 Action 메소드 명 바꾸기 팁 (0) 2018.04.09 Convenience Initializer를 사용하는 경우 (0) 2017.10.09