일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- JavaScript
- 스위프트
- 계산기앱만들기
- 맥
- AJAX
- spring
- 개발기록
- 파이썬서버
- Swift
- 계산기앱
- Xib
- customclass
- FLASK
- iOS계산기
- FileOwner
- 웹
- 스프링
- jQuery
- 딩동말씀
- iOS앱배포
- subscript
- 앱배포
- Python
- iOS배포
- MainScheduler
- DispatchGroup
- Xcode
- ios
- 앱버전구하기
- 자바스크립트
- Today
- Total
개발하는 뚝딱이
[swift] 옵셔널 본문
책 <스위프트 프로그래밍 3판 ;야곰 지음> 을 정리한 글입니다.
옵셔널
1. 옵셔널의 사용
2. 옵셔널 추출
2-0. 강제추출
2-1. 옵셔널 바인딩
2-2. 암시적 추출 옵셔널
- 옵셔널은 스위프트의 특징 중 하나인 안정성을 담보로 하는 문법 기능 중 하나
- 변수나 상수의 값이 nil일 수도 있음을 표현
- 옵셔널과 옵셔널이 아닌 값은 완전히 다른 타입
1. 옵셔널의 사용
- nil은 옵셔널 선언된 곳에서만 사용이 가능
var yourName: String? = "Jason"
var hisName: Optional<String> = "Jess"
var myName: String = "Jin"
myName = nil // 오류!
- 옵셔널은 제네릭이 적용된 열거형
- nil일 때는 none 케이스
- 값이 있는 경우 some 케이스 ; 연관 값인 Wrapped가 할당됨
public enum Optional<Wrapped>: ExpressibleByNilLiteral {
case none
case some(Wrapped)
public init(_ some: Wrapped)
/// 중략...
}
- switch를 통한 옵셔널 값의 확인
func checkOptionalValue(value optionalValue: Any?) {
switch optionalValue {
case .none:
print("This Optional variable is nil")
case .some(let value):
print("Value is \(value)")
}
}
var myName: String? = "Jason"
checkOptionalValue(value: myName) // Value is Jason
myName = nil
checkOptionalValue(value: myName) // The Optional variable is nil
2. 옵셔널 추출
- 옵셔널의 값을 옵셔널이 아닌 값으로 추출하는 옵셔널 추출 (Optional Unwrapping)
2-0. 강제추출
- Forcaed Unwrapping
- 값이 없을 경우 런타임 오류가 일어나는 위험한 방법
- 옵셔널 값의 뒤에 느낌표(!)를 붙여주면 강제로 값을 추출하여 반환
var myName: String? = "Jin"
var jin: String = myName!
myName = nil
jin = myName! // 런타임 오류
// if 조건문을 이용하여 안전하게 처리
if myName != nil {
print("My name is \(myName!)")
} else {
print("myName == nil")
}
2-1. 옵셔널 바인딩
- Optional Binding
- 옵셔널에 값이 있다면, 추출한 값을 일정 블록 안에서 사용할 수 있는 상수나 변수로 할당하여 사용 가능
- if 또는 while 구문과 결합하여 사용
- 옵셔널 바인딩을 통해 여러 개의 옵셔널 값을 한 번에 추출할 수 있으나, 하나라도 nil 값이면 추출되지 않음
var myName: String? = "Jin"
if let name = myName {
print("My name is \(name)")
} else {
print("myName == nil")
}
var yourName: String? = nil
// 옵셔널 바인딩을 사용해 여러 개의 옵셔널 값 추출
if let name = myName, let friend = yourName {
print("We are friend! \(name) & \(friend)")
}
2-2. 암시적 추출 옵셔널
- Implicitly Unwrapped Optionals
- 옵셔널을 표시하고자 하는 타입 뒤에 물음표가 아닌 느낌표 사용
- 가끔 nil을 할당하고 싶지만, 옵셔널 바인딩으로 값을 추출하는게 귀찮거나 로직상 nil 때문에 런타임 오류가 발생하지 않을 것 같다는 확신이 들 때 사용
- 일반 변수처럼 사용이 가능하며, nil 할당과 옵셔널 바인딩도 가능
- 값이 nil일 때 사용하면 오류 발생
var myName: String! = "Jin"
print(myName) // Optional(Jin)
myName = nil
if let name = myName { // myName == nil
print("My name is \(name)")
} else {
print("myName == nil")
}
myName.isEmpty // 오류 발생
var num: Int! = 100
num += 1 // 변수처럼 사용 가능
'swift' 카테고리의 다른 글
[swift] 접근제어 (0) | 2020.05.02 |
---|---|
[swift] 인스턴스 생성 및 소멸 (0) | 2020.05.01 |
[swift] 메소드 (method) (0) | 2020.04.27 |
[swift] 프로퍼티(property) (0) | 2020.04.15 |
[swift] 구조체(struct)와 클래스(class) 비교 (0) | 2020.04.08 |