[Swift] 기본 문법 - 옵셔널
있을 수도 있고, 없을 수도 있어
옵셔널의 뜻이죠 !
변수나 상수 등에 꼭 값이 있다는 것을 보장할 수 없다는 뜻 입니다. 즉, '변수 또는 상수의 값이 nil 일 수도 있다' 입니다 !
애매하죠?
자세히 한 번 알아봐요 ! 레츠고
옵셔널
코드를 사용하면서 육안으로 확인해봐요 !
var myName: String = "ian"
myName = nil // 오류 !
var myName: String? = "ian"
myName = nil
print(myName) // nil
두 코드의 차이점이 보이시나요 ?
위의 코드는 오류가 뜨고, 밑의 코드는 정상적으로 작동합니다 !
myName: String
의 뒤에 물음표의 유무로 옵셔널 처리를 확인 할 수 있었습니다 !
?
를 통해 nil
값이 들어갈 수 있다 ! 를 선언해줬습니다 !
옵셔널은 열거형으로 구현되어 있습니다 !
옵셔널의 정의를 한 번 알아볼까요 ?
public enum Optional<Wrapped> : ExpressibleByNilLiteral {
/// The absence of a value.
///
/// In code, the absence of a value is typically written using the `nil`
/// literal rather than the explicit `.none` enumeration case.
case none
/// The presence of a value, stored as `Wrapped`.
case some(Wrapped)
/// Creates an instance that stores the given value.
public init(_ some: Wrapped)
옵셔널은 제네릭이 적용된 열겨형 입니다.
ExpressibleByNilLiteral
프로토콜을 따른다는 것도 확인할 수 있습니다.
뒤에서 case none
은 값을 가지지 않는 케이스, case some
은 값을 갖고 있는 케이스가 되는데 연관값으로 Wrapped
가 있습니다. 따라서 옵셔널 값이 있으면 some의 연관값인 Wrapped에 값이 할당 됩니다.
즉, 값이 옵셔널이라는 열거형의 방패막에 보호되어 래핑되어 있는 모습이라 생각하면 됩니다 !
옵셔널 추출
옵셔널의 값을 옵셔널이 아닌 값으로 추출하는 방법이 있습니다 !
강제 추출
!
를 쓰는 방법 입니다. 가장 간단하지만 가장 위험한 방법이여서, 최대한 사용을 지양하는 걸 추천합니다 !
만약 강제 추출 시 옵셔널에 값이 없다면(nil) 이라면 런타임 오류가 발생합니다.
var myName: String? = "ian"
var ian: String = myName!
myName = nil
ian = myName! // 런타임 오류 !
if myName != nil {
print("제 이름은 \(myName) 입니다 ! ")
} else {
print("myName == nil")
}
// myNmae -== nil
런타임 오류의 가능성을 항상 갖고 있어서, 옵셔널 강제 추출 방식을 사용하는 걸 지양해야 합니다 !
옵셔널 바인딩
강제 추출 보단 안전하고 세련된 방식을 사용합니다 !
if
나 while
구문 등과 결합하여 사용할 수 있어요.
var myName: String? = "ian"
// 옵셔널 바인딩을 통한 임시 상수 할당
if let name = myName {
print("제 이름은 \(name) 입니다 !")
} else {
print("myNmae == nil")
}
// 제 이름은 ian 입니다 !
// 옵셔널 바인딩을 통한 임시 변수 할당
if var name = myName {
name = "치킨" // var 변수이므로 내부에서 변경이 가능합니다 !
print("제 이름은 \(name) 입니다")
} else {
print("myName == nil")
}
// "제 이름은 치킨 입니다"
if
구문을 샐행하는 블록 안쪽에 name
이라는 상수 보이시죠 ?
옵셔널을 안전하게 바인딩 하고 name
상수에 넣어줍니다 !
옵셔널은 왜 사용할까요 ?
프로그래머 간의 원활한 소통을 위해 사용합니다 !
func optionalTest (name: String?) {
print(name)
}
// optionalTest 에는 String과, nil 값이 들어가야 되는구나 !
func optionalErrorTest (name: String) {
print(name)
}
// optionalErrorTest 에는 무조건 String이 들어와야 되는구나 !
라는 걸 추측할 수 있기 때문입니다 !
출처: 스위프트 프로그래밍(야곰), iOS 프로그래밍을 위한 스위프트 기초(야곰)
Author And Source
이 문제에 관하여([Swift] 기본 문법 - 옵셔널), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@ian/Swift-기본-문법-옵셔널저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)