Objective-C 코드에다가 순진하게 #import "ClassName.swift" 했다가 컴파일 에러에서 1차 멘붕.
#import "ProductName-Swift.h" 해주면 된다.
Objective-C 에선 술술 나왔던 싱글톤 코드가 swift 와서는 어찌 짜야할지 2차 멘붕.
열심히 구글링해서 찾아냄.
let 은 바뀌지 않는 상수
var 은 바뀔 수도 있는 변수
일단 Objective-C 에서의 nil과 swift에서의 nil의 의미가 다르다.
swift 에서의 nil,Objective-C 에서의 nil 모두 '값이 없다' 라는 뜻이지만 swift 에서는 어떤 타입이든 nil을 가질 수 있다.
Optional Type 은 nil 이 될 수도 있는 변수 or 상수를 선언할 때 ? 를 사용한다. ? 가 없으면 Non-Optional Type 으로 nil 이 될 수 없다.
var nonOpt: String 은 Non-Optional Type 이므로 'String' 은 절대 nil이 될 수 없다는 컴파일 에러가 난다.
var opt: String? 은 Optional Type 이므로 컴파일시 에러가 나지 않는다.
위의 warning 은 opt를 사용하지 않으니, var 대신 let으로 바꾸라는 warning 이므로 (이번 예제에서는) 무시한다.
만약 Optional Type 으로 선언한 변수가 값을 갖는다면 그 값은 wrapped 라고 한다. wrapped 된 값은 forced unwrapping 이라는 개념을 이용해서 접근하게 되는데, 이는 Optional Type 에서 값을 강제로 추출한다는 의미이고 이름 뒤에 ! 를 두어 값을 가져온다.
저렇게만 하면 될것같지만 컴파일 에러를 뱉는다. Insert "!" 라는 친절한 가이드가 나오게 된다. 저런 컴파일 에러가 나오는 이유는, index 라는 값이 Int?, 즉 Optional Type 으로 선언되어 있으므로 3 이라는 값이 wrapped 되었다. wrapped 된 값은 forced unwrapping 으로 값을 빼내어야 하기 때문에 ! 를 붙여줘야 한다.
forced unwrapping 하는 또다른 방법은, optional binding을 이용해서 값을 임시변수 or 상수에 할당할 수 있다.
이렇게 작업을 하게 되면 벌어지는 일이
1. index 가 값을 가지고 있는지 확인 (optional value 이므로)
2. 값을 가지고 있다면 value 에 index 값을 할당하고 if문 수행
아니면 var index: Int? 대신에, var index 가 implicitly unwrapped 되도록 선언할 수도 있다.
var index: Int! 여기 느낌표는 이 변수는 암묵적으로 unwrapped 되었다. 라고 선언하는 거다.
Optional Type 을 사용하는 이유?
runtime 시에 발생할 수 있는 에러를 complie시에 체크할 수 있도록 하기 위해서이다. compile시에 nil 체크를 해버리므로 잠재적으로 runtime 시에 발생할 수 있는 에러를 찾아낼 수 있기 때문이다.
세줄요약
Optional Type 만이 nil을 가질 수 있다.
Optional Type 으로 선언했으면 (forced unwrapping || if let || implicitly unwrapped) 세가지 방법 중 하나를 사용해서 값을 사용할 수 있다.
Optional Type은 runtime시에 발생할 수 있는 에러를 complie시에 발견 할 수 있도록 도와준다.
참고/출처