[Swift] 옵셔널 체이닝과 빠른 종료에 대해 알아보자!

zooneon·2020년 11월 10일
0

Swift 기본 문법

목록 보기
7/14
post-custom-banner

본 내용은 '스위프트 프로그래밍' 책을 학습한 후 이를 바탕으로 작성한 글입니다.

옵셔널 체이닝과 빠른 종료

옵셔널 체이닝

  • 옵셔널 체이닝은 옵셔널에 속해 있는 nil일지도 모르는 프로퍼티, 메서드 등을 가져오거나 호출할 때 사용할 수 있는 일련의 과정이다.
  • 중첩된 옵셔널 중 하나라도 값이 존재하지 않는다면 결과적으로 nil을 반환한다.
  • 옵셔널 체이닝은 프로퍼티나 메서드를 호출하고 싶은 옵셔널 변수나 상수 뒤에 물음표를 붙여 표현한다.
  • 결과적으로 nil이 반환될 가능성이 있으므로 옵셔널 체이닝의 반환된 값은 항상 옵셔널이다.
  • 옵셔널 체이닝을 통해 메서드와 서브스크립트 호출도 가능하다.
class Room {
    var number: Int
    
    init(number: Int) {
        self.number = number
    }
}

class Building {
    var name: String
    var room: Room?
    
    init(name: String) {
        self.name = name
    }
}

struct Address {
    var province: String
    var city: String
    var building: Building?
}

class Person {
    var name: String
    var address: Address?
    
    init(name: String) {
        self.name = name
    }
}

let zooneon: Person = Person(name: "zooneon")

zooneon.address = Address(province: "서울시", city: "광진구", building: nil)
zooneon.address?.building = Building(name: "빌딩")
zooneon.address?.building?.room = Room(number: 0)

//옵셔널 바인딩 기능과 결합
if let roomNumber: Int = zooneon.address?.building?.room?.number {
    print(roomNumber)
} else {
    print("방 번호를 찾을 수 없습니다.")
}

빠른 종료

  • 빠른 종료의 핵심 키워드는 guard이다.
  • guard 구문은 Bool 타입의 값으로 동작하며, guard 뒤에 따라붙는 코드의 실행 결과가 true일 때 코드가 계속 실행된다.
  • guard 구문은 항상 else구문이 뒤에 따라와야 하며, Bool값이 false라면 else블록의 내부 코드를 실행한다.
  • else구문의 블록 내부에는 return, break, continue, throw 등의 제어문 전환 명령을 사용하여 상위 코드 블록을 종료하는 코드를 작성한다.
  • fatalError()와 같은 비반환 함수나 메서드를 호출할 수도 있다.
  • guard 구문은 return, break, continue, throw 등의 제어문 전환 명령어를 쓸 수 없는 상황이라면 사용이 불가능하다.
guard Bool 타입 값 else {
	예외사항 실행문
	제어문 전환 명령어
}
  • Bool타입의 값으로 옵셔널 바인딩의 역할도 할 수 있다.
  • guard뒤에 따라오는 옵셔널 바인딩 표현에서 옵셔널의 값이 있는 상태라면 옵셔널 바인딩된 상수를 guard구문이 실행된 아래 코드부터 함수 내부의 지역상수처럼 사용할 수 있다.
func greet(_ person: [String: String]) {
    guard let name: String = person["name"] else {
        return
    }
    print("Hello, \(name)")
}

var personInfo: [String: String] = [String: String]()
personInfo["name"] = "zooneon"

greet(personInfo)
//Hello, zooneon
  • 더 구체적인 조건을 추가하고 싶다면 쉼표로 추가조건을 나열해주면 된다.
  • 추가된 조건은 Bool타입 값이어야 하며, 쉼표로 추가된 조건은 AND논리연산과 같은 결과를 준다.
func personInfo(name: String?, age: Int?) {
    guard let name: String = name, let age: Int = age, age > 19, name.isEmpty == false else {
        print("You are young")
        return
    }
    
    print("You are old")
}

class Person {
    let name: String = "zooneon"
    let age: Int = 24
}

let zooneon: Person = Person()

personInfo(name: zooneon.name, age: zooneon.age)
//You are old
profile
블로그 이전했습니다. https://blog.zooneon.dev
post-custom-banner

0개의 댓글