[Swift] 옵셔널

Dzeko·2021년 7월 15일

Swift 기본

목록 보기
8/20
post-thumbnail

😎 옵셔널

스위프트의 핵심 개념 중 하나!

(값이 있을수도 있고 없을수도 있습니다…)

옵셔널이 왜 필요한가??

  • nil의 가능성을 명시적으로 표현 - 문서/주석을 작성하지 않더라도 nil이 있을 수 있다는 것을 알 수 있음

  • 옵셔널이 아니라면 nil체크를 하지 않고 안심하고 사용할 수 있음

  • 옵셔널 타입이 명시가 되어있지 않은 경우 parameter에 nil을 넣으면 컴파일단계에서 에러


옵셔널 문법 = enum + generics

enum Optional<Wrapped>: ExpressibleByNiliteral {
  case none
  case some(Wrapped)
}

let optionalValue: Optional<Int> = nil
let optionalValue: Int? = nil

옵셔널형들은 값이 있을수도 있고 없을수도 있음

Int?/Int!
Int형의 값 or nil

Swift에서는 기본 자료형 Int, Double, String등은 nil을 저장할 수 없음.
nil도 저장하려면 옵셔널 타입으로 저장해야함

강제 언래핑(forced unwrapping)

var index: Int?
index 변수는 정수 값을 갖거나 아무 값도 갖지 않을 수 있음

var x: Int?    // 옵셔널 정수형 변수 x 선언
var y: Int = 0
x = 10
print(x)   // Optional(10)
print(x!)    // forced unwrapping 되어서 10
print(y)
x = x + 2 // Optional과 Int이므로 안된다.
y = x  // Optional과 Int이므로 안된다. 
       // x!으로 풀어주고는 할 수 있음

옵셔널 변수는 값을 할당하지 않으면 기본적으로 nil이 들어감

var x: Int?
print(x)   // nil
print(x!)   // 강제 언래핑할 값이 없으므로 에러가 난다.

var y : Int? = 10
print(y) // Optional(10)
var z : Int! = 10
print(z)  // Optional(10) 

초기값을 주지 않으면 nil을 받는다

var y : Int?
print(y) // nil
var z : Int!
print(z)  // nil

옵셔널 바인딩(Optional Binding)

강제 언래핑하는 다른 방법으로, 옵셔널 바인딩을 이용하여 옵셔널에 할당된 값을 임시변수 또는 상수에 할당

  1. nil 체크 + 안전한 추출
  2. 옵셔널 안에 값이 들어있는지 확인하고 값이 있으면 값을 꺼내온다.
  3. if-let 방식 사용
if let constantName = optionalName {
  // 	옵셔널 값이 있다면(nil이 아니라면) 언래핑해서 일반상수 constantName에 대입하고 if문을 실행함
  //  값이 없다면 if문의 조건이 거짓이 되어 실행되지 않음
}

var x: Int?
x = 10
if let xx = x {
  print(xx)  //  x에 Optional(10)이라는 값이 있으므로 10이 출력됨
} else {
  print(nil)
}

여러 옵셔널을 언래핑

var pet1: String?
var pet2: String?
pet1 = “cat”
pet2 = “dog”
if let first = pet1, let secondPet = pet2 {
  print(firstPet, secondPet)
} else {
  print(“nil”)
}

let ~, let ~ 혹은 var ~, var ~ 각각 다 작성
,는 and와 같음. 하나라도 틀릴 경우 else문으로 넘어감

0개의 댓글