Swift 옵셔널(Optional)

🌟 Swift가 갖는 Optional이라는 개념은 변수의 값이 nil일 수 있다는 것을 표현. 반대로 Optional이 아니라면(non-optional) 해당 값은 nil이 될 수 없음을 의미.

✅ 선언

var name: String? 
  • ? 키워드를 사용
  • Optional의 디폴트 값은 nil로 name은 nil을 갖게 됨
var name: String // 컴파일에러
var name = nil // 컴파일에러
  • 만약 Optional 키워드를 사용하지 않았다면 값을 입력하라는 에러가 발생. 그 이후에라도 nil을 넣으려하면 컴파일에러가 발생.

🌟 Swift가 기본적으로 non-optional을 지원. nil에 대한 컴파일 에러를 통해 개발자는 nil에 대해 명확한 예외처리가 강제되며, 런타임에 nil로 인한 문제를 컴파일 단계에서 예방할 수 있음

✅ 옵셔널 변수의 이용

var number1:Int? = 20
var number2:Int = 100
number1 + number2
  • Int(optional)와 Int(non-optional)의 연산을 시도 :
    Value of optional type 'Int?' not unwrapped; did you mean to use '!' or '?'?
    위 컴파일 에러가 발생
    number1은 Optional로 nil값을 가질 가능성이 있기 때문에 컴파일 단계에서 에러를 발생. 연산을 수행하기 위해서는 unwrapping 또는 binding 과정이 필요

✅ 옵셔널 해제(Optional Unwrapping)

  • Optional 변수에서 Optional 껍데기를 벗겨내는 작업
var number1:Int? = 20
var number2:Int = 100
if number1 {
    let sum = number1! + number2
}
  • if 로 optional 변수의 값이 nil이 아닌지 판별 후 ! unwrapping 키워드를 통해 강제로 값을 꺼내옴. 만약 if로 nil 체크를 하지 않고 !을 사용한다면 런타임 오류가 발생.

✅ 옵셔널 바인딩(Optional Binding)

var number1:Int? = 20
var number2:Int = 100

if let nonOptionalNumber1 = number1 {
    let sum = nonOptionalNumber1 + number2
}
  • Optional Unwrapping과 비슷하지만 Optional 값을 새로운 상수로 받고, 그 이후로 non-optional값을 사용한다는 차이점.
  • 새로 선언된 nonOptionalNumber1은 이미 non-optional로 연산에 사용할 때 ! 키워드를 사용할 필요 없음

✅ 옵셔널 체이닝(Optional Chaining)

  • 여러 객체를 혼합해서 사용하다보면 Optional끼리의 연산이 필요한 경우가 있음. 이 경우에 객체마다 옵셔널 바인딩을 사용하게 되면, if문이 복잡해짐

  • Optional Chaining을 통해 간단하게 Optional 예외처리

  • swift에서 . 을 통해 클래스의 프로퍼티에 접근이 가능한 점 이용

class A {
    var b:B?
}
class B {
    var c:String?
}
  • 이 경우 A의 프로퍼티 b의 c에 접근할 때, b에대한 옵셔널, c에대한 옵셔널, 2번의 바인딩이 필요
var a:A = A()
if a.b?.c {
}
  • 옵셔널 체이닝을 통해 한 줄로 옵셔널 바인딩이 가능
  • a.b?.c 를 통해 b의 옵셔널, c의 옵셔널 바인딩을 모두 처리 가능
profile
iOS 개발자😺

0개의 댓글

Powered by GraphCDN, the GraphQL CDN