Optional Chaining
Optional chaining is a process for querying and calling properties, methods, and subscripts on an optional that might currently be nil. If the optional contains a value, the property, method, or subscript call succeeds; if the optional is nil, the property, method, or subscript call returns nil. Multiple queries can be chained together, and the entire chain fails gracefully if any link in the chain is nil.
์ต์ ๋ ์ฒด์ด๋
- ๋งค๋ฒ nil ํ์ธ์ ํ์ง ์๊ณ ์ต์ข ์ ์ผ๋ก ์ํ๋ ๊ฐ์ด ์๋์ง ์๋์ง ํ์ธํ ์ ์์ต๋๋ค.
- ์ต์ ๋ ์ฒด์ด๋์ ์ต์ ๋์ ๋ด๋ถ์ ๋ด๋ถ์ ๋ด๋ถ๋ก ์ต์ ๋์ด ์ฐ๊ฒฐ๋์ด ์์ ๋ ์ ์ฉํ๊ฒ ํ์ฉํ ์ ์์ต๋๋ค.
// ์ฌ๋ ํด๋์ค
class Person {
var name: String
var job: String?
var home: Apartment?
init(name: String) {
self.name = name
}
}
// ์ฌ๋์ด ์ฌ๋ ์ง ํด๋์ค
class Apartment {
var buildingNumber: String
var roomNumber: String
var `guard`: Person?
var owner: Person?
init(dong: String, ho: String) {
buildingNumber = dong
roomNumber = ho
}
}
// ์ธ์คํด์ค ์์ฑ
let yagom: Person? = Person(name: "yagom")
let apart: Apartment? = Apartment(dong: "101", ho: "202")
let superman: Person? = Person(name: "superman")
// ์ต์
๋์ฒด์ด๋ ์ฌ์ฉ x
func guardJob(owner: Person?) {
if let owner = owner {
if let home = owner.home {
if let `guard` = home.guard {
if let guardJob = `guard`.job {
print("์ฐ๋ฆฌ์ง ๊ฒฝ๋น์์ ์ง์
์ \(guardJob)์
๋๋ค")
} else {
print("์ฐ๋ฆฌ์ง ๊ฒฝ๋น์์ ์ง์
์ด ์์ด์")
}
}
}
}
}
guardJob(owner: yagom) // // ์ฐ๋ฆฌ์ง ๊ฒฝ๋น์์ ์ง์
์ด ์์ด์
// ์ต์
๋์ฒด์ด๋ ์ฌ์ฉ
func guardJobWithOptionalChaining(owner: Person?) {
if let guardJob = owner?.home?.guard?.job {
print("์ฐ๋ฆฌ์ง ๊ฒฝ๋น์์ ์ง์
์ \(guardJob)์
๋๋ค")
} else {
print("์ฐ๋ฆฌ์ง ๊ฒฝ๋น์์ ์ง์
์ด ์์ด์")
}
}
yagom?.home?.guard?.job = "์๋ฐฉ๊ด"
guardJobWithOptionalChaining(owner: yagom) // "์ฐ๋ฆฌ์ง ๊ฒฝ๋น์์ ์ง์
์ ์๋ฐฉ๊ด์
๋๋ค"'iOS ๐ > Swift' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| Swift16 - ํ์ ์บ์คํ (0) | 2021.02.10 |
|---|---|
| Swift15 - Nil-Coalescing Operator (0) | 2021.02.03 |
| Swift13 - Initialization & Deinitialization (0) | 2021.02.02 |
| Swift12 - ์์ (0) | 2021.02.02 |
| Swift11 - ํ๋กํผํฐ (0) | 2021.02.02 |