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
- runTransaction
- multiprovider
- divider
- transform
- snackbar
- controller
- provider
- switch
- enum
- setstate
- signout
- borderRadius
- Firebase
- Snapshot
- user
- swift 문법
- ListView.builder
- permission
- changenotifierprovider
- Stream
- platformexception
- reference
- Navigator
- datetime
- consumer
- globalkey
- Swift
- 문법
- changenotifier
- Camera
Archives
- Today
- Total
코딩하는 제리
[Swift] swift 옵셔널 본문
// 값을 반환할 때 오류가 발생할 가능성이 있는 값은 옵셔널 타입이라는 객체로 감싸서 반환.
// Int("100")은 100이 아닌 Optional(100)을 리턴함.
// Int("Hi")는 정수 값을 반환할 수 없음. 아무런 값도 반환할 수 없다(nil 반환).
// nil 값을 저장하려면 Optional 타입으로 선언해야함.
// 변수 또는 상수에 아무런 값이 할당되지 않는 상황을 안전하게 처리하기 위함.(null-safety와 비슷?)
// 옵셔널 타입 변수를 선언하기 위해서는 타입 선언부 뒤에 "?" 문자를 씀.
// 정수값을 갖거나 nil을 가질 수 있음.
var index: Int?
// nil 값을 옵셔널이 아닌 변수나 상수에 할당할 수 없음
var myInt = nil // error
var myInt = Int? = nil // OK
var myInt = Int? // OK, 위와 같음 (nil로 초기화됨)
// 강제 언래핑
// 옵셔널 변수 타입에 값이 있으면 옵셔널로 래핑되었다고 함
// 옵셔널에 래핑된 값은 강제 언래핑으로 풀어줌
// 선언시 타입 뒤에 "?", 사용시 변수명 뒤에 "!"
var x : Int?
x = 10
print(x) // Optional(10)
print(x!) // 10
// nil이 아닌지 확인하고 풀어야함.
// 아니면 crash 발생.
if x != nil {
print(x!)
} else {
print("nil")
}
// 옵셔널 바인딩
// 강제 언래핑보다 좋은 방법
// 옵셔널에 할당된 값을 임시 변수 또는 상수에 할당
if let constantname = optionalName {
// 옵셔널 변수가 값이 있다면 언래핑해서 일반 상수 constantname에 대입하고 if문을 실행.
// 값이 없다면 if문의 조건이 거짓이 되어 if문을 실행하지 않음.
print(constantname)
}
if var variablename = optionalName {
// 옵셔널 변수가 값이 있다면 언래핑해서 일반 변수 variablename에 대입하고 if문을 실행.
// 값이 없다면 if문의 조건이 거짓이 되어 if문을 실행하지 않음.
print(variablename)
}
// 여러 옵셔널 언래핑
var pet1: String?
var pet2: String?
pet1 = "cat"
pet2 = "dog"
if let firstPet = pet1, let secondPet = pet2 {
print(firstPet, secondPet)
} else {
print("nil")
}
옵셔널은 연관 값(associated value)을 갖는 enum 이다.
- 옵셔널 자체가 enum으로 구성되어있다.
- 옵셔널은 기본적으로 none과 some을 enum의 case로 가지고 있다.
// 옵셔널은 enum 형식으로 작성되어있다.
var x: Int? = 20 // .some(20)과 동일
var y: Int? = Optional.some(10) // 10과 동일
var z: Int? = Optional.none // nil과 동일
var x1: Optional<Int> = 30 // Int? = 30과 동일
print(x, y, z, x1) // Optional(20), Optional(10), nil, Optional(30)
// age를 옵셔널로 지정하면 switch-case문을 사용할 수 있다.
let age: Int? = 30
switch age {
case .none: // nil인 경우
print("나이 정보 없음")
case .some(let a) where a < 20:
print("미성년자")
case .some(let a) where a < 71:
print("성인")
default:
print("경로우대")
}
'iOS > SwiftUI' 카테고리의 다른 글
[Swift] 타입 검사, 범위 연산자, nil 합병 연산자 (0) | 2022.01.12 |
---|---|
[Swift] swift 형변환 (0) | 2022.01.11 |
[Swift] swift 튜플 (0) | 2022.01.07 |
[Swift] swift 클로저 캡쳐 (0) | 2022.01.07 |
[Swift] swift 클로저 - @autoclosure, @escaping (0) | 2022.01.04 |
Comments