Open Do-hyun-Kim opened 1 year ago
nil
을 사용할 수 있는 타입과 없는 타입을 구분하기 위해 사용하는 타입.
nil
을 사용할 수 있는 Type를 Optional Type
이라 부른다.
// 변수
var name = "knockknock"
//상수
let name = "knockknock"
Type Annotation
이용하여 변수 선언
var name: String?
var name: String? name = nil // ?로 선언된 name에 nil 값 저장 가능
- 타입 추론(`Type Inference`)을 이용하여 변수 선언
let a: Int? = nil let b = a // nil //a처럼 b도 옵셔널 타입으로 선언됨
### Optional Unwrapping
옵셔널 타입의 값을 사용할 땐 옵셔널을 해제해서 사용해야 하고, `nil`일 경우에는 절대 해제하면 안 됨
1. 옵셔널 강제 추출(`Forced Unwrapping`)
- 강제 추출 연산자 : !
- `nil`이 들어있어도 강제로 해제해버리기 때문에 값이 100퍼센트 있는 경우를 제외하고는 웬만해서는 사용해선 안 됨
2. `Optional Binding`
- 옵셔널 표현식이 값을 가지고 있는 경우(nil이 아닌 경우) 정의된 상수에 옵셔널이 해제된 값을 저장하고 `true`를 반환한다.
- 값이 없는 경우 `false`를 반환한다.
- `Optional Binding`의 종류
if let name: Type = OptionalExpression { }
while let name: Type = OptionalExpression { }
guard let name: Type = OptionalExpression else { }
3. `Optional Chaining`
- optional chaining operator : ?.(후위에 ?를 붙인다)
4. `Nil-Coalescing Operator`
- Nil-Coalescing operator : ??
### 📝 참고
- [Swift 공식문서 - Optional](https://developer.apple.com/documentation/swift/optional)
- [Optional 부수기](https://babbab2.tistory.com/15)
nil
)를 나타내는 enum타입이다.
case some(value)
: 값이 존재하는 경우의 associated value를 래핑한 케이스case none
: 값이 존재하지 않는 경우의 케이스let value : type?
혹은 let value: Optional<type>
Swift 가 제공하는 몇가지 Optional Bidning 을 통해서 옵셔널 값을 언래핑(unwrapping)할 수 있다.
if let unwrapped = optional 변수 { ... }
guard let unwrapped = optional 변수 else { ... return }
switch optional 변수 {
case let unwrapped:
....
}
wrapped?.method()?.property
옵셔널 변수가 nil 일 경우 default 로 값을 지정해줄 수 있다.
wrapped ?? value
wrapped!
// someOptionalParm에 nil이 할당 될 수 있다.
func someFunction(someOptionalParam: Int?) {
// ....
}
/// someOptionalParm에 nil이 할당 될 수 없다.
func someFunction(someOptionalParam: Int) {
// ....
}
someFunction(someOptionalParam: nil)
// someFunction(someParam: nil)
명시적 표현
안전한 사용
enum Optional<Wrapped>: ExpressibleByNiliteral {
case none
case some(Wrapped)
}
let optionalValue: Optional
* 옵셔널 표현
1. 느낌표(!)를 이용한 암시적 추출 옵셔널
```swift
// Implicitly Unwrapped Optional
var implicitlyUnwrappedOptionalValue: Int! = 100
switch implicitlyUnwrappedOptionalValue {
case .none:
print("This Optional variable is nil")
case .some(let value):
print("Value is \(value)")
}
// 기존 변수처럼 사용 가능
implicitlyUnwrappedOptionalValue = implicitlyUnwrappedOptionalValue + 1
// nil 할당 가능
implicitlyUnwrappedOptionalValue = nil
// 잘못된 접근으로 인한 런타임 오류 발생
//implicitlyUnwrappedOptionalValue = implicitlyUnwrappedOptionalValue + 1
물음표(?)를 이용한 옵셔널
// Optional
var optionalValue: Int? = 100
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) 런타임 오류가 발생하기 때문에 추천되지 않음
Optional 이란 무엇인지 설명하시오.
Optional
Optional
은 변수나 상수 등에 값이 있음이 보장이 되지 않을때 사용하는 기능으로 Swift 언어의 특징중 하나인Safe
가 보장되는 방법 중 하나이다.enum
으로 정의 되어 있는Optional
은 none, some 케이스를 가지고 있으며 이 때 none는 값이 없음을, some이는 값이 있음을 나타 낸다.Optional의 값 추출 방식
강제 추출(Unconditional Unwrapping) 이란
Optional
로 선언한 변수나 상수에 값이 포함되어 있다는 것을 확신하는 경우 강제 언래핑 해체 연산자!
를 사용하여 강제 추출을 할 수 있다. 하지만 강제 추출 하여 반환 값이nil
일 경우 런타임 오류가 발생한다.옵셔널 바인딩(Optional Binding) 이란
Optional Binding
이란Optional
에 값이 있는지 확인하기 위해 조건부if
혹은while
구문 등을 결합하여 사용하며 값이 있다면 추출한 값을 scope 내에서만 사용 가능한 변수 혹은 상수에 할당하여 사용할 수 있게끔 만들 수 있다.Optional Binding
은guard
구문에서도 사용이 가능 하며if
구문은 scope 범위 내에서만 사용이 가능 하지만guard
구문 같은 경우Optional
Binding
된 상수를 guard 구문 실행 후 지역 상수 처럼 사용 할 수 있다.옵셔널 체이닝 (Optional Chaining)
Optional Chaining
이란 현재nil
일 가능성이 있는 Optional Typeproperties
,Method
,subscripts
를 호출하거나 값을 가져오는 프로세스 이다.properties
,Method
,subscripts
의 호출이 성공 할 수 있게 되며, 만약 접근 도중 하나라도nil
일 경우 즉시nil
값을 반환한다.📝 참고 사이트