Optional이란?
Optional
의 개념은 nil
의 가능성을 문서화하지 않아도 코드만으로 충분히 표현 가능하도록 한다.
- 이는
Optional
이 아닌 경우에 별도의 검사 없이 코드를 작성할 수 있도록하여 안정성을 보장한다.
nil
을 할당할 수도 있지만, 할당하지 않아도 되는 타입
이다.
Optional
타입은 열거형이기때문에 switch
문으로 접근이 가능하다.
Optional
은 기본 데이터 타입과 다른 타입이다. (연산이 허용되지 않는다.)
func someFuction(someOptionalParam : Int?){}
func someFuction2(someParam : Int){}
someFuction(someOptionalParam : nil)
someFuction2(someParam : nil)
public enum Optional<Wrapped> : ExoerssibleByNilLiteral{
case none:
case some(Wrapped)
public init(_ some: Wrapped)
Optional 생성
- 타입 뒤에
?
붙히면 된다.
Int?
와 Int
는 다른 변수 타입으로써, 연산이 불가능하다. 다른 기본 타입에 대해서도 마찬가지이다.
- 타입 뒤에
?
를 붙여 옵셔널 타입을 생성할 수도 있지만, Optinal<Type>
을 통해 옵셔널 변수나 상수를 생성할 수도 있다.
var optionalValue : Int? = 100
switch optionalValue{
case .none:
print("this is nil)
case .some(let value)
print("this is \(value))
}
optionalValue = nil
optionaValue = optionaValue + 1
var op1 : Optinal<Int> = 3
var op2 : Int? = 3
암시적 추출 옵셔널
- 타입 뒤에
!
붙히면 된다.
?
를 붙히는 옵셔널과 다르게 기존 변수처럼 사용(연산)이 가능하다. (일반 데이터 타입과 암시적 추출 옵셔널 데이터 타입 사이의 연산)
- 단,
nil
인경우에는 연산 등이 불가능하다. (런타임 오류 발생)
var optionalValue : Int! = 100
switch optionalValue{
case .none:
print("this is nil)
case .some(let value):
print("this is \(value)")
}
optionalValue = optionalValue + 1
optionalValue = nil
optionalValue = optionaValue + 1
---
Optional Unwrapping
Optional Unwrapping
이란 Optional
타입의 값을 추출하는 것을 의미한다.
Optional Unwrapping
에는 옵셔널 바인딩
과 강제추출
이 존재한다,
Optional Binding(옵셔널 바인딩)
nil
체크와 안전하게 값을 추출하는 방법이다.
if-let
구문을 이용해 값을 추출한다.
- 여러개의 값에 대해서도
if-let
구문을 구성할 수 있다.
- 단, 여러개의 값에 대해 하나라도
nil
이라면 else
구문이 실행된다.
func printName(_ name : String){
print(name)
}
var myName : String! = nil
if let name: String = myName{
printName(name)
} else{
print("myName == nil")
}
-----------------------------------------------
var myName : String? = "lee"
var yourName : String? = nil
if let name = myNAme, let friend = yourName{
print("\(name) and \(friend)")
}
yourName = "yagom"
if let name = myNAme, let friend = yourName{
print("\(name) and \(friend)")
}
Force Unwrapping(강제추출)
nil
인지 검사하지않고 추출하기떄문에, 권장되는 방식은 아니다.
nil
일 시 런타임 에러가 발생한다.
- 값 뒤에
!
를 붙여 수행한다.
func printName(_ name : String){
print(name)
}
var myName : String? = "lee"
printName(myName!)
myName = nil
print(myName!)
var yourName : String! = nil
printName(yourName)