값이 있을 수도, 없을 수도 있음. nil의 가능성을 명시적으로 표현함. 옵셔널은 열거형(enum)과 제너럴(general)이 합쳐져있음.
enum Optional<Wrapped> : ExpressibleByNilLiteral { case none //값이 nil이면 none case case some(Wrapped) //값이 있으면 some case } //옵셔널 두가지 선언 방식// let optionalValue: Optional<Int> = nil let optionalValue: Int? = nil
//eg.1. someOptionalParam이 nil일 수 있음//
func someFunction(someOptionalParam: Int?) {
//..
}
someFunction(someOptionalParam: nil)
//eg.2. someparam은 nil이 될 수 없음//
func someFunction(someParam: Int) {
//..
}
someFunction(someParam: nil) //컴파일 에러
var optionalValue: Int! = 100
switch optinalValue {
case .none:
print("This Optional variable is nil")
case .some(let value):
print("value is \(value)")
}
//기존 변수처럼 사용 가능
optionalValue = optionalValue + 1
//nil 할당 가능
optionalValue = nil
//잘못된 접근으로(nil이 할당된 상태이므로) 인한 런타임 오류 발생
optionalValue = optionalValue + 1
var optionalValue: Int? = 100 //Int 값이 들어있을 수도 없을 수도 있음
switch optionalValue {
case .none:
print("This Optional variable is nil")
case .some(let value):
print("Value is \(value)")
//nil 할당 가능
optionalValue = nil
//기존 변수처럼 사용불가 - 옵셔널과 일반 값은 다른타입이므로 연산불가
//에러// optionalValue = optionalValue + 1
nil병합 연산자는 옵셔널을 사용할 때 유용하게 사용되는 연산자임.
A??B //A가 nil이 아니면 A를 반환, nil이면 B를 반환
//eg.1//
let someValue: Int = optionalInt ?? 0