iOS/Swift
[Swift] 옵셔널 체이닝(Optional Chaining)
year.number
2022. 8. 11. 20:51
옵셔널 체이닝이란?
💡 옵셔널이 중첩되어 있을 때 유용하게 사용할 수 있는 옵셔널 내부 요소의 프로퍼티이다
- 중첩된 옵셔널 중 하나라도 값이 존재하지 않는다면 nil을 반환한다
// ============== < 1. 클래스, 구조체 설계 > ==============
class Room {
var RoomNum: Int
init(RoomNum: Int) {
self.RoomNum = RoomNum
}
}
class Building {
var name: String
var room: Room?
init(name: String) {
self.name = name
}
}
struct Address {
var building: Building?
var city: String
init(city: String) {
self.city = city
}
}
class Person {
var name: String
var address: Address?
init(name:String) {
self.name = name
}
}
// ============== < 2. 인스턴스 생성 > ==============
let yeonsu: Person = Person(name: "yeonsu")
// ============== < 3. 옵셔널 체이닝(1.Ver) > ==============
let yeonsuInfo: Any? = yeonsu.address?.building?.room?.RoomNum
print(yeonsuInfo)
// => 아직 값을 할당하지 않았기 때문에 nil 값이 반환된다
// ============== < 3. 옵셔널 체이닝(2.Ver) > ==============
if let roomNumber: Int = yeonsu.address?.building?.room?.RoomNum {
print(roomNumber)
} else {
print("She has no room")
}
// ============== < 4. 옵셔널 체이닝을 통한 값 할당 > ==============
yeonsu.address = Address(city: "경기도 파주시")
yeonsu.address?.building = Building(name: "연수프라자")
yeonsu.address?.building?.room = Room(RoomNum: 0)
yeonsu.address?.building?.room?.RoomNum = 101
print(yeonsu.address?.building?.room?.RoomNum)
빠른 종료
키워드: guard
if 구문과 유사하게 사용하지만 차이점이 존재한다!
- Bool 타입의 값으로 동작한다
- guard 뒤의 코드가 true일 경우 코드가 계속 실행된다
- 항상 else 구문이 따라와야 한다
for i in 0...3 {
guard i == 1 else {
continue
}
print(i)
}