Optional
값이 '있을 수도 있고, 없을 수도 있음'
let optionalConstant: Int? = nil
// 다음은 에러
let someConstant: Int = nil
// nil 의 가능성을 명시적으로 표현
func someFunction(someOptionalParam: Int?) {
// . . .
}
func someFunction(someParam: Int) {
// . . .
}
Optional(enum + general)
enum Optional<Wrapped> : ExpressibleByNilLiteral {
case none
case some(Wrapped)
}
// Optional<Int> 를 간단하게 Int? 로 표현 하는 것
let optionalValue: Optional<Int> = nil
let optionalValue: Int? = nil
// !
// 암시적 추출 옵셔널 (Implicitly Unwrapped Optional)
var optionalValue: Int! = 100
// 옵셔널은 이넘 타입이기 때문에 값이 있는지 없는지 case 문으로 체크 가능
switch optionalValue {
case .none:
print("This Optional variable is nil")
case .some(let value):
print("Value is \(value)")
}
// 기존 변수처럼 사용 가능
optionalValue = optionalValue + 1
// nil 할당 가능
optionalValue = nil
// 잘못된 접근으로 인한 런타임 오류 발생
optionalValue = optionalValue + 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
Optional Unwrapping
- Optional Binding - 옵셔널 바인딩
- Force Unwrapping - 강제 추출
Optional Binding
- 옵셔널의 값을 꺼내오는 방법 중 하나 nill 체크 + 안전한 값 추출
func printName(_ name: String) {
print(name)
}
var myName: String? = nil
printName(myName)
// 전달되는 값의 타입이 다르기 때문에 컴파일 오류 발생
if - let
func printName(_ name: String) {
print(name)
}
var myName: String! = nil
if let name: String = myName {
printName(name)
} else {
print("myName == nil")
}
// name 상수는 if-let 구문 내에서만 사용가능합니다.
// 상수 사용범위를 벗어났기 떄문에 컴파일 오류 발생
printName(name)
// 여러개 바인딩 가능
var myName: String? = "joy"
var yourName: String? = nil
if let name = myName, let friend = yourName {
print("\(name) and \(friend)")
}
// yourName이 nil이기 때문에 실행되지 않는다.
yourName = "haha"
if let name = myName, let friend = yourName {
print("\(name) and \(friend)")
}
// joy and hana
Force Unwrapping
- 옵셔널의 값을 강제로 추출
func printName(_ name: String) {
print(name)
}
var myName: String? = "joy"
printName(myName!) // joy
myName = nil
print(myName!)
// 강제 추출시 값이 없으므로 런타임 오류 발생
var yourName: String! = nil
printName(yourName)
// nil 값이 전달되기 때문에 런타임 오류 발생
// 강제 추출 하면 오류가 발생할 수 도있기때문에 강제추출 보다는 바인딩 선호
'# 02 > Swift' 카테고리의 다른 글
[Swift] 클래스 (0) | 2020.06.04 |
---|---|
[Swift] 구조체 (0) | 2020.06.04 |
[Swift] 반복문 (0) | 2020.06.04 |
[Swift] 조건문 (0) | 2020.06.04 |
[Swift] 함수 (0) | 2020.06.04 |