Optionals

Youn·2021년 5월 11일
0

iOS-Swift

목록 보기
1/11
post-thumbnail

❓Optionals

  • 값이 없다.
  • 값을 가지지 않아도 되는 형식
let num: Int // type annotaion 으로 자료형 지정
print(num) // 저장된 값이 없음 

optional 이 필요한 이유

  • ex) 네트워크에서 데이터를 받아올 때, 네트워크에 접속되어있지않거나 연결이 끊길 경우 값을 제대로 저장할 수 없다
    -> 값이 저장되어 있지 않으면 접근하는 시점에 에러가 발생한다
    -> 이를 처리하기 위해 옵셔널을 사용한다

optional 타입을 nil로 초기화 하기 위해서는 꼭 type annotation 해줘야한다
let optionalNum: Int? = nil

Optional Binding

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 사용 !!!!
  • 여러 변수 binding → 모든 바인딩이 성공한 경우에만, condition 도 만족하는 경우에만
let a: Int? = 12
let b: String? = "str"
if let num = a, let str = b, str.count > 5 {} // 모든 바인딩이 성공한 경우에만 바인딩 성공!!

Implicitly Unwrapped Optionals

! → 자동으로 추출되는 optional. 값의 존재 확인없이 강제로 추출

let num: Int! = 12
let a = num // a는 optional Int ,형식추론을 하는 경우에는 자동으로 추출되지 않음

let b: Int = num // num이 Int? 면 에러나서 대입할 때 ! 해줘야함 

실제로 자주 사용되는 것은 아님. non optional 에 넣을 때 자동으로 추출, 그냥 optional 쓰기

Optional Chaining

쉽게말해, 연달아서 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

Optional Pattern

옵셔널은 열거형으로 구현되어있고, 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
}
profile
youn

0개의 댓글