as
використовується для оновлення та виливання типів на мостовий тип
as?
використовується для безпечного лиття, поверніть нуль, якщо не вдалося
as!
використовується для примусового лиття, аварії, якщо не вдалося
Примітка:
as!
не можна передати необроблений тип на необов’язковий
Приклади:
let rawString: AnyObject = "I love swift"
let optionalString: AnyObject? = "we love swift"
let nilString: AnyObject? = (nil as String?)
let rawInt: AnyObject = Int(3)
let optionalInt: AnyObject? = Int(3)
let nilInt: AnyObject? = (nil as Int?)
Приклад
var age: Int? = nil
var height: Int? = 180
Додавши ? одразу після типу даних ви повідомляєте компілятору, що змінна може містити число чи ні. Акуратно! Зауважте, що визначати необов'язкові константи не має сенсу - ви можете встановити їх значення лише один раз, і тому ви зможете сказати, буде їх значення нульовим чи ні.
Коли нам слід використовувати "?" і коли "!"
припустимо, у нас є простий додаток на базі UIKit. у нас є деякий код у нашому контролері переглядів і хоче представити новий контролер перегляду поверх нього. і нам потрібно вирішити вивести новий вигляд на екран за допомогою навігаційного контролера.
Як ми знаємо, кожен екземпляр ViewController має контролер навігації властивостей. Якщо ви створюєте додаток на базі контролера навігації, це властивість контролера головного перегляду додатка встановлюється автоматично, і ви можете використовувати його для натискання або виведення контролерів перегляду. Якщо ви використовуєте єдиний шаблон проекту програми - для вас не буде створено автоматичний контролер навігації, тож у контролері подання програми за замовчуванням не буде збережено нічого у властивості navigationController.
Я впевнений, що ви вже здогадалися, що це саме справа для необов'язкового типу даних. Якщо ви перевірите UIViewController, ви побачите, що властивість визначається як:
var navigationController: UINavigationController? { get }
Тож повернемося до нашого випадку використання. Якщо ви знаєте, що ваш контролер перегляду завжди матиме навігаційний контролер, ви можете продовжити його і змусити його розгортати:
controller.navigationController!.pushViewController(myViewController, animated: true)
Коли ви ставите! за назвою властивості ви говорите компілятору, що мені все одно, що ця властивість є необов’язковою, я знаю, що при виконанні цього коду завжди буде зберігати значення, тож ставіться до цього необов’язкового як до звичайного типу даних. Ну хіба це не приємно? Що може статися, якщо у вашому контролері перегляду немає контролера навігації? Якщо ви припускаєте, що в навігаційному контролері завжди знайдеться значення, було неправильним? Ваш додаток вийде з ладу. Простий і некрасивий.
Отже, використовуйте! тільки якщо ви на 101% впевнені, що це безпечно.
А як бути, якщо ви не впевнені, що завжди буде контролер навігації? Тоді ви можете використовувати? замість!
controller.navigationController?.pushViewController(myViewController, animated: true)
Що за ? за ім'ям властивості вказано компілятору: я не знаю, чи містить ця властивість нуль або значення, тому: якщо у неї є значення, використовуйте його, і в іншому випадку просто врахуйте весь вираз нуль. Ефективно? дозволяє використовувати цю властивість лише у випадку, якщо є навігаційний контролер. Ні, якщо перевірки будь-якого виду або кастингу будь-якого типу. Цей синтаксис є ідеальним, коли вам не байдуже, чи є у вас навігаційний контролер чи ні, і хочете щось зробити лише за наявності.
Величезне завдяки Fantageek