값이 있을 수도 없을 수도 있는 상황에서 사용
nil은 옵셔널로 선언된 곳에서만 사용이 가능합니다!
데이터 타입 뒤에 물음표(?) 또는 Optional<>을 이용하여 나타냅니다.
그러나 물음표(?)가 더 간단하기에 굳이 긴 표현을 사용하지 않습니다!
var fruit: String?
// = var fruit: Optional<String>
fruit = nil
print(fruit) // nil
옵셔널은 ExpressibleByNilLiteral 프로토콜을 따른다!
public enum Optional<Wrapped>: ExpressibleByNilLiteral {
case none
case some(Wrapped)
public init(_ some: Wrapped)
...
}
func checkOptional(value OptionalValue: Any?) {
switch optionalValue {
case .none:
print("This Optional variable is nil")
case .some(let value):
print("Value is \(value)")
}
}
따라서 이런 식으로 switch로 optional 처리가 가능합니다
optional 값을 추출하는 방법으로는
여기서 옵셔널 바인딩이란 if let, guard let, if var ,guard var를 통해 값이 있는 지 확인합니다.
var fruit: String? = "grape"
if let ff = fruit {
print("ff is \(fruit)")
} else {
print("fruit is nil")
}
// ff is grape
변수를 사용하고 싶다면 If var, guard var를 사용하고, 여러 개를 사용하고 싶다면 쉼표(,)를 통해 사용합니다!
주의! 1번과 3번은 오류가 생기지 않는다는 전제 하에 사용하므로 굉장히 위험한 방법이므로 지양합시다
옵셔널은 반복적으로 사용하여 옵셔널이 자전거 체인처럼 한 칸이라도 없으면 전체가 동작하지 않는 것을 의미합니다!
하나라도 값이 없으면 nil을 반환!
class Vegetable {
var taste: String
var school: School?
init(taste: String) {
self.taste = taste
}
}
struct School {
var student: String
var teacher: String
var vegetable: Vegetable?
}
class Fruit {
var name: String
var school: School?
init(name: String) {
self.name = name
}
}
let fruit: Fruit = Fruit(name: "grape")
if let chair: String = fruit.school?.vegetable?.taste {
print(chair)
} else {
print("Can not find")
}
nil을 반환하는 것을 알 수 있습니다.