Swift. 옵셔널

2019. 4. 18. 13:14Swift + iOS

옵셔널

옵셔널이란? 값이 있을수도 있고, 없을 수도 있는 것입니다.

스위프트의 키워드 Safe, Fast, Interactive 중에 가장 중요하게 생각하는 것이 'Safe' 입니다.

옵셔널은 Safe를 가장 잘 대변할 수 있는것입니다.

Int: 주황색 공간 안에 값이 무조건 있다는 것을 언어적으로 보장할게.

Int?: 주황색 공간 안에 값이 있을 수도 있고, 없을 수도 있다. 값이 있으면 보호막 안에 값을 넣어 놓고, 없으면 보호막만 넣어 놓을게.

Int 타입에는 nil을 넣을 수가 없어유

Objective-C 에서는 파라미터등의 문서를 보면 'This value must not be nil' 이런 문구가 설명되어 있었다. 그래서 다른 프로그래머와 일 할 때 그 값이 nil인지 아닌지 하나하나 체크해야 했고, 심지어 자기 자신도(!!!) 이 값이 nil인지 아닌지 확인해 봐야 했다. 미래의 나는 과거의 나를 믿을 수 없지... 

 

그런데 지금 Swift에서는 문서 등을 볼 필요도 없이 옵셔널 키워드 등을 통해 바로 nil 이 들어와도 되는지 들어오면 안되는지 알 수 있다.

인스턴스를 생성하다보면 엑스코드의 자동완성 목록에 Int, Int? 이런식으로 물음표가 붙어있는 값이 있는 경우가 있다.

이런 경우는 뒤의 파라미터에 따라 인스턴스가 생성이 되는지 안되는지 갈리게 된다.

 

Int: 뒤의 파라미터에 상관없이 무조건 인스턴스가 생성될거야.

 

Int?: 뒤의 파라미터에 따라 인스턴스가 생성이 안 될 수도 있어~

요런 뜻!

 

 


옵셔널 언래핑

옵셔널 바인딩

 

 // Objective-C
 if(someObject != nil) {
     //nil 체크를 제대로 하지 않는다면 프로그램이 죽는 문제가 발생한다.(crash)
 }

Objective-C일 때는 옵셔널인 값을 위의 방식을 사용해서 체크 했었다. 이 nil 체크를 제대로 하지 않으면 프로그램이 죽는 문제가 발생하게 된다.

스위프트에서는 박스(보호막)한테 노크를 해서 nil값인지 아닌지 물어보는 방식을 사용한다.

박스에 노크해보자

 

노크하는 방법: if let, guard let ..

옵셔널 체이닝

! 를 사용한 강제 추출

강제 추출 방식은 쾅ㅋ왘와코아쾅카ㅗ아콩카ㅓㅇㅋ아 해서 상자를 부셔버리는 것이다. 만약에, 부셨는데 값이 없으면 CRASH가 발생해서 프로그램이 죽는다. 

에러 해결을 누르면?!?
Xcode가 제안해주는 깡패 느낌표 해결법

이렇게 강제 추출을 하면 실행 중에 오류가 발생해 앱이 죽어버린다...  우리는 저 값이 화아아아악실 하게 있는지 없는지 모르고 있었다고 해도 언제 없어지게(!!!) 바뀔지도 모르니까 !를 이용한 강제 추출은 사용을 안 하는 것이 좋다. 그런데 Xcode는 느낌표 붙여서 해결하라고 자꾸 떠든다. Xcode 미워.

암시적 추출 옵셔널

선언부에 !가 들어있는 경우

기본적으로 강제로 빼오는 형태를 취하는 옵셔널

옵셔널이기 때문에 옵셔널 바인딩을 사용할 수 있음.

 

 

 

1. 옵셔널은 왜 써야 하는가?
2. 옵셔널은 바인딩을 통해 정중하게 노크하고 들어가자~ 낰낰
3. 선언할 때 특별한 이유가 없는 한 ?로 선언합시다~~

 

'Swift + iOS' 카테고리의 다른 글

iOS. 네비게이션 컨트롤러  (0) 2019.07.30
Swift. 클로저(Closures)  (0) 2019.05.07
Swift. Extension  (0) 2019.04.25
Xcode. Xcode 디버깅 팁  (7) 2019.04.22