이번 글은 옵셔널에 대해 다뤄보려고 한다. 옵셔널은 스위프트의 특징 중 하나인 안전성을 문법으로 담보하는 기능으로, C언어에서는 찾아볼 수 없는 개념이다.
enum Optional<Wrapped> : ExpressibleByNilLiteral {
case none
case some(Wrapped)
}
! (암시적 추출 옵셔널)
?
옵셔널은 값을 보호해주는 상자가 있다고 생각하면 됨
값 추출을 하는 것은 상자 안에 값이 있는지 없는지 확인을 하는 것임 !!
(출처 : 야곰의 스위프트 유튜브)
옵셔널 바인딩
강제 언래핑
func printName( name: String) {
print(name)
}
var myName: String? = nil
printName(myName) //값의 타입이 달라 컴파일 오류 발생 : string과 optional은 다른 타입
//if-let
func printName( name: String) {
print(name)
}
var myName: String! = nil
if let name: String = myName { //if-let에서 지정된 상수는 if-let 구문 내에서만 사용 가능
printName(name)
} else {
print("myName == nil")
}
printName(name) //이렇게 밖에서 사용 불가능
var myName: String? = "yagom"
var yourName: String? = nil
if let name = myName, let friend = yourName { //두 가지 다 nil이 아니어야 실행 가능
print("\(name) and \(friend)")
} //yourName이 nil이기 때문에 실행 안됨
//optional 강제 추출
func printName( name: String) { //String 타입
print(name)
}
var myName: String? = "yagom" //optional 타입
printName(myName!) //yagom --> optional과 String은 다른 타입이라 원래는 불가능한데, !를 통해 optional을 강제 추출하여 가능해짐
myName = nil
print(myName!) //강제 추출 시 값이 없으므로 런타임 오류 발생
var yourName: String! = nil //암시적 추출
printName(yourName) //런타임 오류, 암시적 추출해서는 알아서 느낌표를 붙여주는 효과 --> printName(yourName!)과 같음
//guard let
var firstValue: Int? = 30
var secondValue: Int? = 50
func unwrap(parameter: Int?) {
print("unwrap() called")
//값이 없으면 리턴
guard let unWrappedParam = parameter else { return }
print("unWrapped Param : \(unWrappedParam)")
}
unwrap(parameter: firstValue) //firstValue값이 nil이라면 unWrappedParam : 부분은 print되지 않음 !
[출처] 스위프트 프로그래밍 (야곰), 야곰의 스위프트 기초문법 강좌, 개발하는 정대리 스위프트 강좌