- Swift는 기본적으로 nil(값없음) 을 허용하지 않지만 개발을 하다보면 값이 없는 경우가 생기게 됩니다!
struct Person {
var name: String
var age: Int
var car: String? // ?를 붙여서 옵셔널 타입이라고 명시하여 값이 없을 수도 있다고 알려줄 . 수있어요
func introduce(){
print("안녕하세요. 제 이름은 \(name)이고, 나이는 \(age)살 입니다.")
}
}
Swift는 기본적으로 nil
을 허용하지 않지만, Optional
을 사용하면 값이 없을 수 있는 상태를 안전하게 처리할 수 있습니다.
nil
키워드는 값이 없음
을 의미합니다.옵셔널
이라고 하며, 옵셔널 타입은 nil
값을 저장할 수 있습니다.?
키워드를 사용하여 옵셔널 타입
으로 선언할 수 있습니다.struct
, class
, enum
)클로저
Optional
로 감싸진 값이 나옵니다.Optional로 래핑된 값
이라고 부릅니다.
var intvalue: Int?
var intvalue: Int? = 1
// 값에 접근하면 Optional로 래핑된 값으로 나옵니다.
print(intValue) // Optional(1) : 옵셔널로 래핑된 값이 1이 출력됩니다.
Optional 값
기분 타입과 연산이 불가능합니다.옵셔널 타입
과 기본 타입
은 다른 타입이기 때문에 연산이 불가능합니다.
var intValue: Int? = 5
intValue += 5 // Error 발생
// Value of optional type 'Int' must be unwrapped to a value of type
// Int? 타입은 Int 타입과 다르기 때문에 컴파일 오류 발생!
옵셔널 체이닝은 옵셔널 타입을 포함하는 복잡한 데이터 구조에서 옵셔널 값이
nil
인지를 간결하게 체크하고 접근할 수 있는 방법입니다.
nil
이 있는 경우 자동으로 nil
을 반환합니다.?
를 붙여서 체이닝할 수 있습니다.
struct Dog {
var toy: String?
}
struct Person{
var pet: Dog?
}
let person1: Person? = nil // nil
let person2: Person? = Person(pet: nil) // nil
let person3: Person? = Person(pet: Dog(toy: nil)) // nil
let person4: Person? = Person(pet: Dog(toy: "ping")) // Optional("ping")
var optionalClosuer: ((Int) -> Void)? = { value in
print(value)
}
optionalClosure?(3) // optional(3)
?
를 붙인 후 .
을 사용하면 중첩된 프로퍼티나 메소드에 접근할 수 있습니다.nil
이면 전체 값을 nil
을 반환합니다.nil
이 아니라면 Optional
로 래핑된 값을 반환합니다.if let
을 사용한 옵셔널 바인딩guard let
을 사용한 옵셔널 바인딩옵셔널 타입은 값이 없을 수도 있는 경우를 안전하게 처리하기 위해 사용되지만, 값에 접근하면
optional(값)
으로 래핑되어 있어서 바로 사용하지 못하는 불편함이 있습니다. 따라서 이 옵셔널로 래핑된 값에서 옵셔널을 제거하고 값으로 변환하는 과정을옵셔널 언래핑
이라고 부르며, 몇가지 방법으로 이를 수행할 수 있습니다.
if
, guard
구문을 사용하여 안전
하게 옵셔널을 언래핑하는 방법입니다.if let
if let
을 사용하여 옵셔널 바인딩을 할 수 있습니다..if let
코드블록이 실행되고, 이 블록 안에서 언래핑 된 값을 사용할 수 있습니다.else
코드블록을 작성하면 됩니다.
var inValue: Int? = 10
if let intValue = inValue {
print(intValue) // 출력 값 : 10
// Optional 언래핑되어 실제 값이 출력됩니다.
// 옵셔널 언래핑된값은 해당 블록에서만 사용 가능합니다.
} // Optional(10)
guard let
guard let
구문은 옵셔널 바인딩 결과가 nil
일 경우,
func guardLetFunction() {
var optionalValue: String? // 아무런 값을 주지않아서 nil인 상태
guard let optionalValue = optionalValue else {
print("guard 실행") // optionalValue가 nil이면 해당
return // 함수를 실행하여 아래로 못내려가게
}
print(optionalValue) // 위의 guard let에서 함수가 종료되어 실행되지 못함
guardLetFunction()
// "guard 실행"
}
Nil-결합 연산자(Nil-Coalescing Operator) 방법을 사용하는 방법입니다.
옵셔널 값 뒤에 ??
를 붙인 후 기본값을 제공할 수 있습니다.
옵셔널 값이 nil
이면 ??
뒤에있는 기본 값을 사용합니다.
let name: String? = nil
print(name ?? "Default Name") // 값이 nil이여서 ?? 뒤에 있는 "Default Name"이 출력됩니다.
let greeting = "안녕하세요 \(name ?? "A")님!"
print(greeting) // "안녕하세요 A님!" 이 호출됩니다.
// namedㅣ nil이여서 기본 값 "A"를 사용합니다.
!
를 붙여서 사용합니다.nil
이 아니라면 언래핑 되지만 nil이면 런타임 오류
를 발생시킵니다 !nil
이 아님을 확신할 때 사용합니다.var name: String? = "Brody"
print(name!) // "Brody" 출력
name = nil
print(name!) // 런타임 오류 발생
?
가 아닌 !
를 사용하면 묵시적 언래핑 되는 옵셔널로 정의할 수 있습니다.nil
일 때 접근하면 런타임 오류가 발생합니다.
var name: String! = "Brody" // 타입을 String!으로 설정하여 묵시적 옵셔널 언래핑을 사용
print(name) // Optional("Brody") : 값 자체는 옵셔널
print(name.count) // 5 : 값에서 가져온 값은 옵셔널값이 아닌 일반 값 출력
if let name = name {
print(name) // "Brody" 출력
}