쉽게 설명하자면
nil 이라는 값을 가질 수 있으면 Optional Type이고,
Optional Type을 선언할 때 타입 옆에 ? 를 붙인다.
let name: String? // String? = Optional Type
let age: Int? // Int? = Optional Type
nil과 null은 다르다!Nil : 오류가 났지만, 앱 중단시키는 것 대신 nil을 돌려줄 테니 오류 난 것을 알려줄 때 사용
Null : 어떠한 값도 가지지 않고 있다는 뜻
let dictHuman = ["name": "je", "gender": "female"]
let name = dictHuman["name"] // "je"
let gender = dictHuman["je"] // nil
name이라는 key에 접근을 하면 je 이라는 value가 잘 뜨지만,
je이라는 key에 접근을 했을 때 dictHuman에는 je이라는 key가 존재하지 않기 때문에 nil이 뜸
어떤 자료형이든 nil을 반환하고 저장 할 수 있을까?
→ NO !! 절대 불가능하다
nil을 저장할 수 있는 건 오로지 Optional로 선언된 자료형 뿐이다.
Non-Optional Type은 선언과 동시에 초기화 해주던가 Type Annotation을 사용해야 된다.
⇒ 이 친구는 무조건 값을 가져야 한다 !! 값이 없으면 오류 발생 !!!!
Optional Type
// Type Annotation
var name: String?
name = nil // ?로 선언된 name에는 nil 저장 가능
// Type Inference
let a: Int? = nil
let b = a
print(b) // nil
아까 nil이란? 을 설명했을 때
let gender = dictHuman["je"] // nil
위 구문이 가능했던 이유는 dictHuman에서 value값을 가져오는 의 원형을 보면
@inlinable public subscript(key: Key) -> Value?
subScript 리턴 값이 옵셔널로 선언되어 있다.
따라서 dictHuman[”je”]의 리턴 값은 옵셔널 자료형인거고,
상수 gender는 타입 추론에 의해 옵셔널 자료형을 갖게 된 것이다.
var today: String
var weather: String?
print(type(of: today)) // String
print(type(of: weather)) // Optional<String>
Non-Optional Type = String Type
Optional Type = Optional Type