반응형
Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 후행 클로저
- userdefaults
- uikit
- 원격 푸시
- TableView
- 동시성프로그래밍
- CoreLocation
- for-in
- Choosing Between Structures and Classes
- AppTransportSecurity
- property wrapper
- IBOutlet
- SWiFT
- DispatchQueue
- WWDC16
- firebase
- 연산 프로퍼티
- 진입점
- RunLoop
- ios
- viewcontroller
- entrypoint
- Understanding Swift Performance
- UIButton
- 트레일링 클로저
- OperationQueue
- weak
- IBOutletCollection
- tableViewCell
- Remot Push
Archives
- Today
- Total
iOS 공부하는 감자
Day12) 옵셔널 본문
반응형
옵셔널
- 타입 이름 뒤에 ? 키워드를 붙여서 표현한다.
- 변수나 상수의 값이 nil일 수도 있다는 것을 의미한다. (값이 있을수도 없을수도 있다는 뜻)
- 값이 존재하지 않을 경우에 발생 가능한 오류(런타임오류)를 방지하기 위해 사용된다. (불확실성을 방지)
옵셔널을 사용하는 이유
- 함수에 전달되는 매개변수 값이 잘못된 경우, 제대로 처리되지 못했음을 nil 반환으로 표현
- 함수의 매개변수가 필수적이지 않을 때 해당 매개변수의 타입을 옵셔널로 정의
- nil 가능성을 문서화하지 않고, 코드만으로 표현 가능 (ex-this value can be nil 같은 주석이 필요하지 않음)
- 예외 상황을 최소화하는 안전한 코딩이 가능함
옵셔널 정의
- 옵셔널은 열거형으로 정의되어 있다.
-
public enum Optional<Wrapped> : ExpressibleByNilLiteral { case none case some(Wrapped) public init(_ some: Wrapped) // ... 중략 }
- 값이 nil인 경우 none 케이스
- 값이 있는 경우 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? = "dong" checkOptionalValue(value: myName) // Value is dong myName = nil checkOptionalValue(value: myName) // This Optional variable is nil
- 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) where value > 10: print("Large Value!! \(value)") case .some(let value): print("Value \(value)") case .none: print("nil") } }
옵셔널 추출
옵셔널 강제 추출
- 가장 간단하지만 위험한 방법 (런타임 오류의 발생 가능성이 높다.)
- 옵셔널을 만든 의미가 무색해지는 방법
- 옵셔널 값 뒤에 느낌표(!)를 붙여주면 옵셔널을 강제로 추출하여 반환 (만약 값이 nil이라면 런타임 오류 발생)
-
let someOptionalInt: Int? = 3 // Optional(3) let forced: Int = someOptionalInt! // 3
옵셔널 바인딩
- 옵셔널에 값이 있다면 추출한 값을 일정 블록(if, while) 안에서 사용 가능한 상수나 변수로 할당하여 옵셔널이 아닌 형태로 사용할 수 있도록 한다.
- if 또는 while 구문 등과 결합하여 사용 가능하다.
-
var myName: String? = "dong" // 옵셔널 바인딩을 통한 임시 상수 할당 if let name = myName { print("My name is \(name)") } else { print("My name == nil") } // My name is dong //-------------------------------------------------------------- // 옵셔널 바인딩을 통한 임시 변수 할당 if var name = myName { name = "wizplan" // 변수이므로 내부에서 변경이 가능 print("My name is \(name)") } else { print("My name == nil") } // My name is wizplan
-
var myName: String? = "dong" var yourName: String? = nil // friend에 바인딩이 되지 않으므로 실행되지 않는다. if let name = myName, let friend = yourName { print("We are friend! \(name) & \(friend)") } yourName = "eric" if let name = myName, let friend = yourName { print("We are friend! \(name) & \(friend)") } // We are friend! dong & eric
반응형
'22 베이직 챌린지' 카테고리의 다른 글
Day14) 객체지향 프로그래밍 (0) | 2022.01.16 |
---|---|
Day13) 타입캐스팅 (0) | 2022.01.15 |
Day11) 프로토콜, 익스텐션 (0) | 2022.01.13 |
Day10) 클래스와 상속 (0) | 2022.01.12 |
Day9) 메서드, 접근제한자, Static (1) | 2022.01.11 |