Видеокурсы по изучению языка программирования Swift. Подробнее

Доступ к свойствам через ОП

Если вы нашли опечатку в тексте, выделите ее и нажмите CTRL + ENTER.

Как было показано в разделе ОП как альтернатива принудительному развертыванию, вы можете использовать опциональную последовательность для доступа к свойству опционального значения и проверить результат доступа к этому свойству на успешность

Используйте классы, определенные ранее, для создания нового экземпляра Person и попробуйте получить доступ к свойству numberOfRooms, как вы делали ранее:

let john = Person()
if let roomCount = john.residence?.numberOfRooms {
    print("John's residence has \(roomCount) room(s).")
} else {
    print("Unable to retrieve the number of rooms.")
}
// Выведет "Unable to retrieve the number of rooms."

Так как john.residence равен nil, этот вызов опциональной последовательности не будет успешен как и ранее.

Вы можете попробовать установить значение свойства через опциональную последовательность:

let someAddress = Address()
someAddress.buildingNumber = "29"
someAddress.street = "Acacia Road"
john.residence?.address = someAddress

В этом примере попытка установить значение свойству address опциональному свойству residence? провалится, так как john.residence все еще nil.

Присваивание является частью опциональной цепочки, что означает, что никакой код справой стороны не вычисляется. В предыдущем примере не так просто заметить, что someAddress никогда не вычисляется, потому что доступ к самой константе не имеет никаких побочных эффектов. Пример ниже делает тоже самое прививание, но он использует функцию для того, чтобы создать адрес. Функция выводит "Function was called" до того, как вернется значение, что позволяет вам увидеть была ли вычислена правая часть от оператора присваивания.

func createAddress() -> Address {
    print("Function was called.")
    
    let someAddress = Address()
    someAddress.buildingNumber = "29"
    someAddress.street = "Acacia Road"
    
    return someAddress
}
john.residence?.address = createAddress()

Можно заметить, что функция createAddress() не вызывается, так как ничего в консоли у нас не выводится.

 

Swift: 
4.0