swift & iOS/swift

[swift] 옵셔널 optional 타입을 다루는 5가지 방법

whale3 2022. 1. 20. 23:00

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

 

반응형