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

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

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

Вы можете использовать опциональную последовательность для вызова метода опциональной величины, и проверить сам вызов метода на успешность. Вы можете сделать это, даже если этот метод не возвращает значения.

Метод printNumberOfRooms класса Residence выводит текущее значение numberOfRooms. Вот как выглядит этот метод:

func printNumberOfRooms() {
    print("The number of rooms is \(numberOfRooms)")
}

Этот метод не определяет возвращаемого значения. Однако функции и методы без возвращаемого значения имеют неявный возвращаемый тип Void, как было описано в главе “Параметры функции и возвращаемые значения”. Это означает, что они возвращают значение () или просто пустой кортеж.

Если вы вызовите этот метод на опциональном значении в опциональной последовательности, то он вернет тип не Void, а Void?, потому что возвращаемые значения всегда опционального типа, когда они вызываются через опциональную последовательность. Это позволяет вам использовать конструкцию if для проверки на возможность вызова метода printNumberOfRooms, даже если метод сам не определяет возвращаемого значения. Сравните возвращаемое значение от вызова printNumberOfRooms и nil, для того чтобы увидеть, что вызов метода прошел успешно:

if john.residence?.printNumberOfRooms() != nil {
    print("It was possible to print the number of rooms.")
} else {
    print("It was not possible to print the number of rooms.")
}
// Выведет "It was not possible to print the number of rooms."

То же самое верно, если вы попытаетесь установить свойство через опциональную последовательность. Пример выше в “Доступ к свойствам через опциональную последовательность” пытается установить значение address в john.residence, хотя свойство residence равно nil. Любая попытка установить свойство через опциональную последовательность возвращает значение Void?, которое позволяет вам сравнивать его с nil, для того, чтобы увидеть логический результат установки значения свойству (успех, провал):

if (john.residence?.address = someAddress) != nil {
    print("It was possible to set the address.")
} else {
    print("It was not possible to set the address.")
}
// Выведет "It was not possible to set the address."
Swift: 
3.0