day_by_day

14. 옵셔널 체이닝과 빠른종료 본문

QA Automation/swift5

14. 옵셔널 체이닝과 빠른종료

kokorii_ 2023. 6. 21. 15:10

옵셔널 체이닝과 옵셔널 바인딩의 차이

Swift에서 옵셔널 체이닝과 옵셔널 바인딩은 모두 옵셔널을 처리하는 데 사용되는 방법이다.

옵셔널 체이닝은 옵셔널 값의 속성이나 메서드에 액세스하는 데 사용되는 반면, 옵셔널 바인딩은 옵셔널 값이 nil이 아닌지 확인하고 값이 nil이 아니라면 값을 변수에 할당하는 데 사용됩니다.

14.1 옵셔널 체이닝

  • 옵셔널에 속해 있는 nil 일지도 모르는 프로퍼티, 메서드, 서브스크립션 등을 가져오거나 호출할 때 사용할 수 있는 일련의 과정
    • 옵셔널을 반복 사용하여 옵셔널이 자전거 체인처럼 서로 꼬리를 물고 있는 모양이기 때문에 옵셔널 체이닝이라고 부른다
    • 옵셔널에 값이 있다면 프로퍼티, 메서드 등 호출 가능
    • 옵셔널이 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 street: String
  var building: Building?
  var detailAddress: String?
  
}

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

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

let blairRoomChaning: Int? = blair.address?.building?.room?.number

print(blairRoomChaning) //nil
  • 옵셔널 바인딩 예제
let blair: Person = Person(name: "blair")

var roomNumber: Int? = nil

if let blairAddress: Address = blair.address {
  if let blairBuilding: Building = blairAddress.building {
    if let blairRoom: Room = blairBuilding.room {
      roomNumber = blairRoom.number
    }
  }
}

if let number: Int = roomNumber {
  print(number)
} else {
  print("Can not find room number")
}

//위와 동일한 표현

if let roomNumber: Int = blair.address?.building?.room?.number {
  print(roomNumber)
} else {
  print("Can not find room number")
}
  • 옵셔널 체이닝을 통해 여러 단계로 복잡하게 중첩된 옵셔널 프로퍼티나 메서드 등에 매번 nil 체크를 하지 않아도 손쉽게 접근할 수 있다
  • 옵셔널 체이닝을 통해 값을 할당할 수도 있다.
blair.address?.building?.room?.number = 505
  • 메서드도 옵셔널 체이닝을 통해 호출 가능

14.2 빠른 종료

  • if 문과 유사하게 bool 타입의 값으로 동작하는 기능
  • guard let 구문
    • guard 뒤에 따라붙는 코드의 실행결과가 true 일때 코드가 계속 실행
    • guard 구문은 항상 뒤에 else 가 따라와야 함
  • guard 뒤의 bool 값이 false 라면 else 구문을 실행
    • else에는 return, break, continue, throw 등의 제어문 전환 명령을 사용한다.
    • fatalError와 같은 비반환 함수나 메서드를 호출할 수도 있다
  • 예외 상황만 처리하고 싶다면 guard 구문을 사용하는 것이 간편
  • 문법
guard Bool 타입 else {
	예외사항 실행문
	제어문 전환 명령어
}
  • guard 구문과 옵셔널 바인딩
func greet(_ person: [String: String]) {
  guard let name: String = person["name"] else {
    return
  }
  
  print("Hello \\(name)!")
  
  guard let location: String = person["location"] else {
    print("I hope the weather is nice near you")
    return
  }
  
  print("I hope the weather is nice in \\(location)")
  
}

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

greet(personInfo)

personInfo["location"] = "Korea"

greet(personInfo)
  • guard 구문에 구체적인 조건을 추가하고 싶다면 쉼표로 추가조건을 나열해준다.
  • 이때 쉼표로 추가된 조건은 && 논리 연산과 같은 결과를 낸다

'QA Automation > swift5' 카테고리의 다른 글

15. 맵, 필터, 리듀스  (0) 2023.06.21
13. 클로저  (0) 2023.06.21
12. 접근제어  (0) 2023.06.21
11. 인스턴스 생성 및 소멸  (0) 2023.06.21
10. 프로퍼티와 메소드  (0) 2023.06.21