본 내용은 '스위프트 프로그래밍' 책을 학습한 후 이를 바탕으로 작성한 글입니다.
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