Swift 옵셔널

김윤홍·2024년 6월 7일

옵셔널(Optional)

  1. 옵셔널은 값이 있을 수도있고 없을 수도 있는 상황에서 사용한다.
  2. 옵셔널 타입끼리의 연산은 불능하다.
  3. 옵셔널은 ?로 나타냅니다.
var optionalInt : Int? = 42
var optionalString : Optional<String> = "42"

var num1: Int? = 4
var num2: Int? = 2

num1 + num2
//Binary operator '+' cannot be applied to two 'Int?' operands 
//Optional(4) + Optional(2) 옵셔널타입끼리는 연산 불가능!

nil

Swift에서는 기본적으로 변수 선언시 nil 값이 들어가는 것을 허용하지 않는다

하지만 옵셔널은 가능!!

변수에 nil을 할당함으로써 값이 없는 상태의 옵셔널 프로퍼티를 만들 수 있다.

또한 Swift에서 nil은 optional 변수 이외에서 사용할수 없고 null과 달리 nil은 단순히 value가 없는 것을 의미함.

var num: Int? // num은 자동으로 nil로 설정된다.

var num2: Int? = 42
num2 = nil

옵셔널 바인딩(Optional Binding)

옵셔널 바인딩은 옵셔널 값이 빈값인지 존재하는지 검사한 후, 존재하는 경우 그 값을 다른 변수에 대입시켜 옵셔널을 해제해준다

빈값을 체크하고 옵셔널 값을 언래핑 해주는 것은 ! 강제로 언래핑하는 것보다 훨씬 안전하다

언래핑 방법에는 if let, if var, gurad let, guard var가 있다

if let 과 guard let의 차이점
if let변수는 지역변수 이고 guard let변수는 전역변수이다
let num: Int? = 123

if let bindingNum = num {
	print(bindingNum)
}
//출력문 1234
print(bindingNum)
// error if 지역변수이기 때문이다.

let a: Int? = 10
let b: Int? = nil

func binding() {
guard let a = a else {return}
print(num)

guard let b = b else {return}
}

binding()
//출력문 10

var force : Int? = 42
print(force!)
//강제언래핑 출력문: 42

옵셔널 변수 값이 nil일 경우 default값 설정해주기

var a : Int? = 1
let number = a ?? 0
//출력문: 1
// a에 값이 들어가있기 때문에 1이 출력된다

var b: Int? = nil
let number2 = b ?? 0
//출력문 0 b가 nil이기 때문에 default값이 나옴

옵셔널 체이닝 (Optional chaining)

언래핑 없이 옵셔널 값의 멤버에 접근한다

프로퍼티, 메서드 또는 서브 스크립트를 호출하려는 옵셔널 값 뒤에 물음표 (?)를 배치하여 옵셔널 체이닝 지정

옵셔널이 nil일 경우 옵셔널 체이닝은 nil을 반환하는 반면에 강제 언래핑은 런타임 에러

class Person {
	var name: Country?
}

class Country {
	var region = "Korea"
}

let person = Person()
let nation = person.name!.region
//런타임 에러 발생 
//대신 옵셔널 체이닝 사용
if let region = person.name?.region {
	print("Now I live in Korea")
}

0개의 댓글