๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
iOS ๐ŸŽ/Swift

Swift14 - Optional Chaining

by yongmin.Lee 2021. 2. 3.

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