Swift ставить високу плату за безпеку типу. Вся мова Swift була розроблена з урахуванням безпеки. Це одна з характерних ознак Свіфта і така, яку слід зустріти з розпростертими обіймами. Це допоможе розробити чистий, читабельний код та допоможе уникнути збоїв у вашій програмі.
Усі додаткові опції в Swift розмежовані ?
символом. Встановивши ?
ім'я типу після того, як ви оголошуєте його як необов’язковий, ви по суті виводите це не як тип, який знаходиться перед ?
, а замість цього як необов'язковий тип.
Примітка: Змінний або типу Int
є НЕ таким же , як Int?
. Вони є двома різними типами, які не можна керувати один одним.
Використання за бажанням
var myString: String?
myString = "foobar"
Це не означає, що ви працюєте з типом String
. Це означає, що ви працюєте з типом String?
(String необов’язковий або Факультативний рядок). Насправді, коли ви намагаєтесь
print(myString)
під час виконання консолі налагодження буде надруковано Optional("foobar")
. Частина " Optional()
" вказує, що ця змінна може мати або не мати значення під час виконання, але так буває, що вона містить рядок "foobar". Ця Optional()
індикація " " залишатиметься, якщо ви не зробите те, що називається "розгортанням" додаткового значення.
Розгортання необов’язкового означає, що зараз ви видаєте цей тип як необов'язковий. Це створить новий тип і призначить нове необов'язкове тип значення, яке знаходилось в межах цього факультативного. Таким чином ви можете виконувати операції над цією змінною, оскільки компілятор гарантував її тверде значення.
Умовно Unwrapping перевіряє, чи є значення в необов'язковому nil
чи ні. Якщо це не так nil
, з'явиться нещодавно створена константа змінної, якій буде присвоєно значення і розгорнуто в необов'язковий константа. І звідти ви можете сміливо використовувати необов'язкове в if
блоці.
Примітка. Ви можете надати умовно розгорнутій константі те саме ім'я, що і необов'язкова змінна, яку ви розгортаєте.
if let myString = myString {
print(myString)
// will print "foobar"
}
Умовно розгортання необов'язкових - це найчистіший спосіб отримати значення необов’язкового, оскільки якщо воно містить значення нуля, то все, що знаходиться в блоці if let, не буде виконуватися. Звичайно, як і будь-який вислів if, ви можете включати ще блок
if let myString = myString {
print(myString)
// will print "foobar"
}
else {
print("No value")
}
Примусово розгортання виконується за допомогою використання !
оператора, який відомий як ("удар"). Це менш безпечно, але все ж дозволяє компілювати ваш код. Однак кожен раз, коли ви використовуєте оператор вибуху, ви повинні бути на 1000% впевнені, що ваша змінна насправді містить суцільне значення перед примусовим розкручуванням.
var myString: String?
myString = "foobar"
print(myString!)
Це вище є повністю дійсним кодом Swift. Він виводить значення, myString
яке було встановлено як "foobar". Користувач побачив би foobar
надруковані в консолі, і це про це. Але припустимо, що значення ніколи не було встановлено:
var myString: String?
print(myString!)
Зараз у нас на руках інша ситуація. На відміну від Objective-C, кожного разу, коли робиться спроба примусово розгортати необов'язковий, і необов'язковий не встановлено, і це робиться nil
, коли ви намагаєтесь розгортати необов'язковий, щоб побачити, що всередині вашої програми стане збоєм.
Розгортання w / тип лиття . Як ми вже говорили раніше, якщо ви є unwrapping
необов'язковим, ви фактично перетворюєте його на необов'язковий тип, ви також можете передавати необов'язковий іншому типу. Наприклад:
var something: Any?
Десь у нашому коді змінна something
буде встановлена з деяким значенням. Можливо, ми використовуємо дженерики або, можливо, існує якась інша логіка, яка спричинить це до зміни. Тож пізніше в нашому коді ми хочемо використовувати, something
але все-таки зможемо по-різному ставитися до нього, якщо це інший тип. У цьому випадку ви хочете використовувати as
ключове слово, щоб визначити це:
Примітка. as
Оператор - це те, як ви вводите роль "Свіфт".
// Conditionally
if let thing = something as? Int {
print(thing) // 0
}
// Optionally
let thing = something as? Int
print(thing) // Optional(0)
// Forcibly
let thing = something as! Int
print(thing) // 0, if no exception is raised
Зауважте різницю між двома as
ключовими словами. Як і раніше, коли ми насильно розкручували факультативні, ми використовували для цього !
оператор чуб. Тут ви зробите те саме, але замість того, щоб робити це як просто необов'язковий, ви також будете робити це як Int
. І він повинен бути в змозі бути скасованим, оскільки в Int
іншому випадку, як, наприклад, використання оператора чуб, коли значенням буде nil
ваша програма.
І щоб використовувати ці змінні взагалі в якійсь чи математичній операції, їх потрібно розкрутити, щоб це зробити.
Наприклад, у Swift один одному можуть працювати лише ті численні типи даних про кількість даних. Коли ви передаєте тип разом із as!
вами, ви змушуєте скинути цю змінну так, як ніби ви впевнені, що вона такого типу, тому безпечно працювати і не збивати вашу програму. Це нормально до тих пір, поки змінна справді є такою, до якої ти її кидаєш, інакше у тебе буде безлад на руках.
Тим не менш, кастинг за допомогою as!
дозволить зібрати ваш код. За допомогою кастингу з ані as?
- це інша історія. Насправді, as?
оголошує ваш Int
як абсолютно інший тип даних всі разом.
Тепер це так Optional(0)
І якщо ви коли-небудь намагалися зробити домашнє завдання, написавши щось подібне
1 + Optional(1) = 2
Ваш вчитель математики, ймовірно, дав би вам "F". Те саме зі Свіфтом. За винятком того, що Свіфт швидше взагалі не збирає, а не дає оцінку. Тому що наприкінці дня необов'язковий може насправді бути нульовим .
Безпека перших дітей.