728x90
Optional
- 값이 있을수도, 없을수도 있음을 나타내는 표현이에요.
- 의미
- 변수 또는 상수에 꼭 값이 있다는 것을 보장할 수 없다는 뜻이에요.
- 변수 또는 상수의 값이 nil일 수도 있따는 것을 의미해요.
- 옵셔널 변수 / 상수가 아니라면 값에 nil을 할당할 수 없어요.
- 옵셔널 변수 / 상수는 데이터 타입 뒤에 ?(물음표)를 붙여줘요.
// Optional : 값이 있을수도 없을수도 있음을 의미해서, nil일 수도 있다는 뜻이에요.
var myName: String = "Sophie"
print(myName)
var whoAmI: String? = "Milky"
print(whoAmI) // Optional("Milky") 가 출력되요.
Optional 은 Enum으로 정의되어 있어요.
- nil일 때는 none 케이스가, 값이 있는 경우에는 some 케이스가 되는데, 이 경우 연관값 Wrapped에 그 값이 할당됩니다.
public enum Optional<Wrapped> : ExpressibleByNilLiteral {
case none
case some(Wrapped)
public init(_ some: Wrapped)
...
}
- 옵셔널은 Enum으로 정의되어 있기 때문에, 값 유무를 체크할 때 switch문을 사용할 수 있어요.
// 옵셔널은 enum으로 정의되어 있기 때문에, 옵셔널 값을 체크할 때 switch문을 쓸 수 있습니다.
switch whoAmI {
case .some(let name):
print("My Name is \\(name)")
case .none:
print("No Name!")
}
옵셔널 추출
- 옵셔널 값을 옵셔널이 아닌 값으로 꺼내오는 것을 뜻해요
[방법1] 강제 추출(!) 의 방법을 써서 간단하게 추출할 수 있지만 런타임 오류가 일어날 가능성이 높아요.
- 옵셔널 값의 뒤에 !(느낌표)를 붙여주면 옵셔널 값을 강제로 추출해 반환합니다.
- 그런데 아주 만약 값이 없다면..! nil이라면 런타임 오류가 발생해요. (→ 앱이 죽어요 😇)
var optionalString: String? = "Hello, Optional!"
// 옵셔널이 nil이 아님이 확실한 경우에만 사용
let forcedString = optionalString!
print(forcedString) // Hello, Optional!
// 이 경우에 런타임 에러가 발생할 수 있어요
optionalString = nil
let willBeCrahsedString = optionalString!
print(willBeCrahsedString)
[방법2] 옵셔널 바인딩의 방법을 쓸 수 있어요.
- if 구문으로 변수의 값이 nil인지를 먼저 체크하는 방법으로, 값이 있는지를 확인할 때 사용해요.
- 옵셔널에 값이 있다면, 그 값을 변수나 상수로 할당해 블록 안에서 옵셔널이 아닌 형태로 사용할 수 있어요.
// 옵셔널 바인딩
// 값이 있는지를 체크하고, 값이 있으면, 구문 안에서 상수 또는 변수로 할당해 옵셔널이 아닌 형태로 사용할 수 있어요.
var optionalName: String? = "John"
// Using optional binding to check and extract the value
if let name = optionalName { // 옵셔널 바인딩
// 값이 있으면 이렇게
print("Hello, \\(name)!")
} else {
// 값이 없을때(nil일 때) 처리
print("Name is nil.")
}
728x90
'Swift' 카테고리의 다른 글
[Swift] 프로퍼티(Property) / 메서드(Method) / 인스턴스(Instance) (1) | 2023.11.27 |
---|---|
[Swift] 구조체(Struct) 와 클래스(Class) (1) | 2023.11.27 |
[Swift] 함수(Function) (0) | 2023.11.15 |
[Swift] 반복문 (Loop - for / while / repeat-while) (0) | 2023.11.15 |
[Swift] 조건문(Conditional Statement - if / switch) (0) | 2023.11.15 |