선택 사항은 설정되거나 설정되지 않습니다 (nil 또는 nil이 아님) ... 중요한 결정을 내릴 수 있습니다. "두 가지 상태 모두에서 올바르게 작동 할 수 있도록 코드를 어떻게 작성해야합니까?" 우리 가 선택 사항 을 푸는 방식이 우리 를 위해 결정하는 것입니다.
설정되지 않은 선택 사항에 대응하는 데 사용할 수있는 몇 가지 방법이 있습니다.
- 크래시!
- 값을 기본값으로 설정합니다 (설정되지 않은 경우).
- 정상적으로 실패합니다. 즉, 아무 작업도하지 않고 값이 설정된 경우 에도 할당합니다.
- 우아하게 실패합니다. 즉, 아무 것도하지 않지만 값이 설정되어 있으면 무언가를 수행합니다 (단일 할당 이상입니다).
다음은 4 가지 접근 방식입니다.
값이없는 경우 강제 언 래핑 을 사용 하면 충돌이 발생 합니다. 이 값을 갖는 것이 영화 제목과 같이 매우 중요한 경우이 작업을 수행 할 수 있습니다 (모든 영화에는 이름이 있어야 함). 강제 언 래핑에 사용됩니다.!
movieTitle = movie.title!
nil 병합을 사용 하는 것은 더 많은 제어 를 제공하는 또 다른 방법입니다 . 즉, 값이 설정되지 않은 경우 충돌이 발생하지 않으며 설정되지 않은 경우 '아무것도 설정하지 않음'을 의미합니다. 예를 들어 이름이 설정되지 않은 경우 영화의 이름을 untitled_movie로 기본 / 설정 합니다 . ??nil 병합에 사용됩니다.
var movieTitle = movie.title ?? "untitled_Movie"
사용 옵션 체인을 아무것도하지 않습니다하는 경우, 당신은 가치가 없으며, 값을 설정합니다 경우 이 값을 가지고있다. 값을 설정 하는 것이 중요 하지 않은 경우 ( 예 : 배우의 에이전트 이름)에 대해이 작업을 수행합니다 . ?선택적 연결에 사용됩니다.
let agent = movie.leadActor?.agent
let agent = movie.leadActor!.agent
사용 if-let(또는 guard두 가지 유형의있는 바인딩 옵션 )하는 것은 당신에게 줄 것이다 더 제어 값이 설정되어 있지 않은 경우,이 충돌하지 않습니다. 값이 설정되면 무언가를 할 수 있습니다. 설정되지 않은 경우 else문을 추가 할 수 있습니다 .
if let supportingActor = movie.supportingActor{
print(" The supporting actor is \(supportingActor)}
강제 언 래핑이 다소 권장되지 않으므로 가장 일반적으로 사용되는 언 래핑 방법입니다. 권장되지 않는 이유에 대한 자세한 내용은 여기를 참조 하십시오 . 사이 좋은 비교의 경우 guard와 if-let참조guard vs. if-let
참고 :
선택적 바인딩과 선택적 체인은 일반적으로 함께 사용됩니다.
if let agent = movie.leadActor?.agent {
ContactInfo = agent.phoneNumber
}