https://www.udemy.com/course/ios-13-app-development-bootcamp/
요새 이 강의도 들으면서 공부하고 있는데 여기에서 옵셔널 타입을 다루는 방법을 잘 알려준 부분이 있어서 기록으로 남긴다.
분명 다음 주에 내가 다시 볼 듯...
1. forced unwrapping (! 키워드 사용, 강제로 옵셔널 벗기기)
! 키워드를 사용하여 옵셔널을 벗겨내는 방법인데 이 방법은 옵셔널 값이 nil인지 실제로 어떤 값이 있는 것인지 확인하지 않고 무조건 벗기기 때문에 안전하지 않다. 옵셔널 nil을 강제로 옵셔널을 벗기려고 하면 프로그램이 에러를 내뿜으며 종료되어 버린다. 켁
let num: Int?
num = 10 // Optional(10)
let anotherNum = num! // 10
2. if문으로 nil인지 확인한 후에 forced unwrapping
아래처럼 if 문으로 옵셔널 값이 nil이 아닌 것을 확인한 후에 ! 키워드를 사용하여 옵셔널을 벗길 수도 있기는 하다. 이렇게 하느니 아래 3번의 옵셔널 바인딩이 조금 더 깔끔할 것 같다.
let num: Int?
num = 10
if num != nil {
let value = num! // nil이 아닌 것을 확인한 후에 옵셔널 강제로 벗기기
} else {
// ...
}
3. optional binding 옵셔널 바인딩
아래 if let.. 부분처럼 작성하면 x가 nil이 아닐 때만 값이 let 상수에 할당되고 if문 몸통 안에서 해당 상수를 활용할 수 있다.
let x: Int?
x = 10
if let safeValue = x {
print(safeValue) // 10
}
4. nil coalescing (?? 키워드)
옵셔널 타입인 값이 nil일 때 기본값이 들어가도록 하고 싶다면 ?? 키워드를 사용하여 좀 더 간단하게 작성할 수 있다. coalescing이 '합치다' 라는 뜻인데 두 가지 값 중에 하나로 합쳐져서 그런걸까...?
let x: Int?
x = 10
let defaultValue = 777
let num = x ?? defaultValue // x가 nil이면 defaultValue가, x가 nil이 아니면 x값이 num에 할당된다.
5. optional chaining (옵셔널 체이닝 - struct, class가 옵셔널 타입인 경우)
구조체나 클래스도 옵셔널 타입일 수 있다(failable initializer). 옵셔널 타입의 구조체, 클래스의 프로퍼티나 메소드에 접근하려고 할 때 아래처럼 ?를 붙여서 사용한다. 해당 구조체, 클래스가 nil이 아닐 때만 프로퍼티, 메소드에 접근한다. xcode에서 옵셔널 타입의 struct이나 class의 프로퍼티, 메소드에 접근하려고 하면 아래처럼 . 앞에 ?을 알아서 붙여주기도 한다.
만약 구조체, 클래스가 nil이면 프로퍼티에 접근할 수 없고 그냥 nil 인 것이기 때문에 ??와 같이 사용할 수도 있다.
struct MyStruct {
var num = 10
func shoutOut() {
print("MyStruct method")
}
}
let myStruct: MyStruct?
myStruct = myStruct()
// myStruct이 nil이 아닐 때만 옵셔널을 벗긴 뒤 프로퍼티와 메소드에 접근
myStruct?.num
myStruct?.shoutOut()
myStruct?.num ?? "nil이네요"
// 이렇게 강제로 옵셔널을 벗길수도 있지만 안전하지 않은 방법이다.
myStruct!.num
* 체이닝은 . 을 이용해 목걸이 체인처럼 쭉쭉 연결 연결(?)해서 작성하는 것을 말한다. 위에서는 아주 짧지만 자바스크립트나 reactiveX 라이브러리 시리즈 처럼 함수형으로 작성하면 아래처럼 . 을 사용하며 길게 연속적으로 작성할 수 있다. (스위프트도 함수형으로 작성하는게 있는것 같던데...)
// 자바스크립트
const arr = [1, 2, 3, 4, 5]
const len = arr.filter(n => n > 3).map(n => n += 1).length
'swift & iOS > swift' 카테고리의 다른 글
[swift] failable initializer (0) | 2022.01.21 |
---|---|
[swift] struct vs. class 구조체와 클래스 (간단함 주의) (0) | 2022.01.20 |
[swift] 소수점 둘째 자리 까지 나타내기 (feat. round(), String) (0) | 2022.01.20 |
[swift] 중첩 함수 (nested functions) (0) | 2022.01.19 |
parameter vs argument (0) | 2022.01.16 |