DEV Community

Naveen Ragul B
Naveen Ragul B

Posted on • Updated on

Swift - 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.

  • This is very similar to (!) forced unwrapping of its value. The main difference is that optional chaining fails gracefully when the optional is nil, whereas forced unwrapping triggers a runtime error when the optional is nil.

  • The result of an optional chaining call is always an optional value, even if the property, method, or subscript you are querying returns a non-optional value.

example :

class Person {
    var residence: Residence?
}
Enter fullscreen mode Exit fullscreen mode
class Residence {
    var rooms: [Room] = []
    var numberOfRooms: Int {
        return rooms.count
    }
    subscript(i: Int) -> Room {
        get {
            return rooms[i]
        }
        set {
            rooms[i] = newValue
        }
    }
    func printNumberOfRooms() {
        print("The number of rooms is \(numberOfRooms)")
    }
    var address: Address?
}
Enter fullscreen mode Exit fullscreen mode
class Room {
    let name: String
    init(name: String) { self.name = name }
}
Enter fullscreen mode Exit fullscreen mode
class Address {
    var buildingName: String?
    var buildingNumber: String?
    var street: String?
    func buildingIdentifier() -> String? {
        if let buildingNumber = buildingNumber, let street = street {
            return "\(buildingNumber) \(street)"
        } else if buildingName != nil {
            return buildingName
        } else {
            return nil
        }
    }
}
Enter fullscreen mode Exit fullscreen mode
if let beginsWithThe =
    john.residence?.address?.buildingIdentifier()?.hasPrefix("The") {
    if beginsWithThe {
        print("John's building identifier begins with \"The\".")
    } else {
        print("John's building identifier doesn't begin with \"The\".")
    }
}
Enter fullscreen mode Exit fullscreen mode

Top comments (0)