옵셔널 체이닝과 빠른 종료

- 옵셔널 바인딩을 하는 것인데 여러 값이 중첩된 형태를 띄우는 형태를 말한다

- 옵셔널을 이해하지 못하고 Swift를 사용한다면 절반도 이해하지 못한다고 할 정도로 중요한 개념이 옵셔널이다

 

옵셔널 체이닝

- 옵셔널에 속해 있는 nil일지도 모르는 프로퍼티, 메서드, 서브스크립트 등을 가져오거나 호출할 때 사용할 수 있는 일련의 과정

  - 옵셔널이 nil이면 모두 nil을 반환한다.

  - 당연히 nil이 아니면 제 값을 반환/호출한다

- 옵셔널을 반복 사용하여 옵셔널이 체인처럼 꼬리를 물고 있는 모양을 말한다

 

느낌표(!)의 사용

  • 값을 강제로 추출하기 때문에 옵셔널에 값이 없다면 런타임 오류가 발생한다
  • 또한 반환값은 옵셔널이 아니라는 점이다
  • 따라서 옵셔널이 아닌 타입에 nil 이 들어오는? 오류가 발생한다
  • 무조건 100% nil이 아니라고 확신하더라도 사용을 지양하는 것이 좋다

 

let optionalChaining: Int? = person.address?.building?.room?.number // nil

let oprionalUnwrapping: Int = person.address?.building?.room?.number // 런타임 오류

 

빠른 종료

- 옵셔널을 추출할 때 사용되는 guard가 핵심이다

- if 문과 유사하게 Bool 타입으로 동작한다

- B.U.T. guard 뒤의 구문이 false 라면 else 블록 내부 코드를 실행하게 되는데, 여기서 블록 내부에는 자신보다 상위의 코드 블록을 종료하는 코드가 들어가야합니다

- guard 구문을 사용해서 함수나 블록에서 쓸데없이 모두 진행할 필요없이, 앞에서 옵셔널을 추출한 후에 nil이라면 바로 블록을 나올 수 있다 -> 이게 바로 빠른 종료를 이용하는 것이다

 

guard Bool타입 else{
	예외상황 실행문
    상위 코드 블록을 종료하는 코드
}

 

func enterClub(name: String?, age: Int?){
	guard let name: String = name, let age: Int = age, age > 19, name.isEmpty == false else{
    	print("넌 너무 어려서 못 들어간다!")
        return // 반환 타입이 Void기 때문에 어떠한 값도 반환하지 않는다
    }
    
    print("어서오세요 \(name)")
}

//대충 예가 기억이 안나서 이 사람이 클럽에 들어갈 수 있는가?라는 함수를 작성해보자

func canEnterClub(name: String?, age: Int?) -> Bool{
	guard let name: String = name, let age: Int = age, age > 19, name.isEmpty == false else{
    	print("넌 너무 어려서 못 들어간다!")
        return false // 반환 타입이 Bool이기 때문에 Bool 타입의 값을 반환하는데, 이 사람은 들어갈 수 없으므로 false를 반환
    }
    
    print("어서오세요 \(name)")
}

 

+ Recent posts