값이 없다.
let num: Int // type annotaion 으로 자료형 지정
print(num) // 저장된 값이 없음
optional 타입을 nil로 초기화 하기 위해서는 꼭 type annotation 해줘야한다
let optionalNum: Int? = nil
binding 이란 ?
→ 구체적인 값, 성격을 확정하는 것. 값 할당하는 것
var num: Int? = nil
print(num!) // 값 강제 추출
/*binding */
if let name:TYPE = EXP {} //값이 있을 때만 binding
if num != nil {
print(num!} //강제 추출 num은 optionalInt
}
/*위와 같음*/
if let n = num { // unwrapping 돼서 바인딩 됨
print(n) // n은 Int n. (num 변수랑 같은 이름이어도 됨)
}
guard let num = num else{} // 이후 구문에서 num 사용 !!!!
let a: Int? = 12
let b: String? = "str"
if let num = a, let str = b, str.count > 5 {} // 모든 바인딩이 성공한 경우에만 바인딩 성공!!
!
→ 자동으로 추출되는 optional. 값의 존재 확인없이 강제로 추출
let num: Int! = 12
let a = num // a는 optional Int ,형식추론을 하는 경우에는 자동으로 추출되지 않음
let b: Int = num // num이 Int? 면 에러나서 대입할 때 ! 해줘야함
실제로 자주 사용되는 것은 아님. non optional 에 넣을 때 자동으로 추출, 그냥 optional 쓰기
쉽게말해, 연달아서 optional을 호출하는 것
- 결과는 항상 optional
- 표현식 중 하나라도 nil을 리턴한다면 이어지는 표현식 확인 없이 nil return
- return 형식은 마지막 표현식에 따라서 결정된다
var optionalP: Person? = Person(name: "jame", email: "jiel@dkjfl.com") let b = optionalP?.contacts.name // -> b의 자료형은 string 이 아닌 optional string
- method 가 optional을 return 하면 괄호 뒤에 ?붙임 (괄호 앞에붙일 때는 함수 자체가 옵셔널일때)
getFunction()?.value // method 가 optional 을 return let f: (() -> Person?)? = p.getFunction // 함수 자체가 optional f?()?.vlaue // 괄호 앞에 ? 붙임
- 리턴값, value 로 속성접근하거나 뭘 하려고 하면 ? 붙여야 함
var num = address["citi"]?.count
옵셔널은 열거형으로 구현되어있고, none 케이스와 some 케이스가 있다.
if let x = a {}
// ==
if case .some(let x) = a {}
// == enumeration case pattern + optional pattern
if case let x? = a { //optional version identifier 뒤에 물음표 붙임
print(x)
// a상수에 값이 있으면 x 에 할당, binding 되고 실행됨, 바인딩되는 시점에 unwrapped
}