[Swift] 옵셔널(Optional)
2022. 9. 15. 12:37
참조 : Swift 스위프트 프로그래밍 3판 Swift 5, 저자 야곰 (한빛미디어) , The Swift Programming Language Swift 5.6 Edition (iBooks)(https://books.apple.com/kr/book/the-swift-programming-language-swift-5-6/id881256329)
옵셔널(Optional)
- Swift의 특징 중 하나인 안전성을 문법으로 담보하는 기능
- 값이 있을 수도 없을 수도 있음을 나타내는 표현
- 변수 또는 상수의 값이 nil일 수도 있다는 것
- nil은 옵셔널로 선언된 곳에서만 사용 가능
- 옵셔널 변수 또는 상수 등은 데이터 타입 뒤에 물음표(?)를 붙여 표현
var myName: Optional<String> // 옵셔널 선언
var myName: String? // 같은 의미지만 이것을 더 사용
- 옵셔널을 사용하는 상황
- 만든 함수에 전달되는 전달인자의 값이 잘못된 값인 경우
→ nil을 반환하여 오류가 있음을 알릴 수 있음 - 매개변수를 굳이 넘겨도 되지 않는다는 뜻으로 매개변수 타입을 옵셔널로 정의하는 경우
- 옵셔널은 열거형으로 구성
- 옵셔널은 값을 갖는 경우와 그렇지 못한 경우 두 가지로 정의
- 값을 가지는 경우 → some 케이스, 연관값으로 Wrapped가 있음
- 값을 가지지 않는 경우 → non케이스
- 여러 케이스의 조건을 통해 검사를 하고자 한다면 where절과 병합하여 사용하면 더욱 유용하게 사용 가능
let numbers: [Int?] = [2, nil, -4, nil, 100]
for number in numbers{
switch number{
case .some(let value) where value < 0:
print("Negative value!! \(value)")
case .some(let value) wheree value > 10:
print("Large value!! \(value)")
case .some(let value):
print("Value \(value)")
case .none:
print("nil")
}
}
// Value 2
// nil
// Negative value!! -4
// nil
// Large value!! 100
옵셔널 추출
- 강제추출(Forced Unwrapping) : 옵셔널 값에! 을 붙여 값을 강제로 추출하여 반환, 런타임 오류가 일어날 가능성이 높아
가장 간단한 방법이지만 가장 위험한 방법
- 옵셔널 바인딩 : 옵셔널 값이 있는지 확인할 때 사용, 옵셔널 값이 있다면 옵셔널에서 추출한 값을 일정 블록 안에서 사용할 수 있는
상수나 변수로 할당해서 옵셔널이 아닌 형태로 사용할 수 있게 해 줌, if나 while구문과 결합하여 사용
- 임시 상수를 사용할 때는 if 블록 밖에서는 사용할 수 없고 else 블록에서도 사용 불가
- 변수로 사용하고 싶다면 if var을 통해 임시 변수로 할당할 수 있음
- 쉼표를 사용하여 한번에 여러 옵셔널 값을 추출 가능 → 옵셔널 중 하나라도 값이 없다면 해당 블록 내부의 명령문 실행 안됨
var myName: String? = "kim"
// 옵셔널 바인딩을 통한 임시 상수 할당
if let name = myName{ // let 선언
print(" My name is \(name)")
}else{
print("my name == nil")
}
// My name is kim
// 옵셔널 바인딩을 통한 임시 변수 할당
if var name = myName{ // var 선언
name = "son"
print("My name is \(name)")
}else{
print("My name == nil")
}
// My name is son
암시적 추출 옵셔널
- 옵셔널 바인딩으로 매번 값을 추출하기 귀찮거나 로직상 nil 때문에 런타임 오류가 발생하지 않을 것 같다는 확신이 들 때 nil을
할당해줄 수 있는 옵셔널이 아닌 변수나 상수
- 느낌표(!)를 이용하여 사용
// 암시적 추출 옵셔널의 사용
var myName: String! = "kim"
print(myName) // kim
myName = nil
// 암시적 추출 옵셔널도 옵셔널이므로 당연히 바인딩을 사용할 수 있음
if let name = myName{
print("My name is \(name)")
}else{
print("myName == nil")
}
// myName == nil
myName.isEmpty // 오류
728x90
'iOS > Swift' 카테고리의 다른 글
[Swift] 구조체와 클래스 (0) | 2022.09.16 |
---|---|
[Swift] 모나드 (0) | 2022.09.16 |
[Swift] 함수 (0) | 2022.09.14 |
[Swift] 연산자 (0) | 2022.09.14 |
[Swift] 맵, 필터, 리듀스 (0) | 2022.09.14 |