Swift высоко ценит безопасность типов. Весь язык Swift был разработан с учетом безопасности. Это одна из отличительных черт Swift, которую стоит приветствовать с распростертыми объятиями. Это поможет в разработке чистого, читабельного кода и поможет предотвратить сбой вашего приложения.
Все опции в Swift обозначены ?
символом. Устанавливая ?
после имени типа , в котором вы объявляя в качестве факультативных вы по существу литье это не как тип , в котором находится на рассмотрении ?
, но вместо этого в качестве дополнительного типа.
Примечание: Переменный или типа Int
является не таким же , как Int?
. Это два разных типа, которые нельзя эксплуатировать друг на друге.
Использование опционально
var myString: String?
myString = "foobar"
Это не значит, что вы работаете с типом String
. Это означает, что вы работаете с типом String?
(String Optional или Optional String). На самом деле, когда вы пытаетесь
print(myString)
во время выполнения консоль отладки напечатает Optional("foobar")
. Часть « Optional()
» указывает, что эта переменная может иметь или не иметь значение во время выполнения, но именно так и происходит в настоящее время со строкой «foobar». Эта « Optional()
» индикация останется, если вы не сделаете то, что называется «развертывание» необязательного значения.
Развертывание необязательного означает, что вы используете этот тип как необязательный. Это создаст новый тип и присвоит значение, которое находилось в этом необязательном, новому необязательному типу. Таким образом, вы можете выполнять операции с этой переменной, поскольку компилятор гарантированно имеет твердое значение.
Условно Unwrapping проверит, является ли значение в дополнительном nil
или нет. Если это не так nil
, будет вновь созданная константная переменная, которой будет присвоено значение и развернута в необязательную константу. И оттуда вы можете смело использовать необязательные в if
блоке.
Примечание. Вы можете присвоить своей условно развернутой константе то же имя, что и необязательной переменной, которую вы разворачиваете.
if let myString = myString {
print(myString)
// will print "foobar"
}
Условное развёртывание опций - это самый чистый способ получить доступ к значению опциона, потому что если оно содержит значение nil, то все в блоке if let не будет выполняться. Конечно, как любое выражение if, вы можете включить блок else
if let myString = myString {
print(myString)
// will print "foobar"
}
else {
print("No value")
}
Принудительная распаковка выполняется с помощью так называемого !
("взрыва") оператора. Это менее безопасно, но все же позволяет вашему коду компилироваться. Однако всякий раз, когда вы используете оператор bang, вы должны быть уверены на 1000%, что ваша переменная действительно содержит твердое значение перед принудительным развертыванием.
var myString: String?
myString = "foobar"
print(myString!)
Это выше полностью действительный код Swift. Он печатает значение, myString
которое было установлено как «foobar». Пользователь увидит foobar
напечатанное в консоли и все. Но давайте предположим, что значение никогда не было установлено:
var myString: String?
print(myString!)
Теперь у нас другая ситуация в наших руках. В отличие от Objective-C, всякий раз, когда делается попытка принудительно развернуть необязательный параметр, и необязательный параметр не был установлен, и nil
при попытке развернуть необязательный элемент, чтобы увидеть, что внутри вашего приложения, будет аварийно завершать работу.
Развертывание с типом литья . Как мы уже говорили ранее, хотя вы unwrapping
необязательный, вы на самом деле приводите к не необязательному типу, вы также можете привести не необязательный тип к другому типу. Например:
var something: Any?
Где-то в нашем коде переменная something
будет установлена с некоторым значением. Может быть, мы используем дженерики или, может быть, есть какая-то другая логика, которая заставит это измениться. Итак, позже в нашем коде мы хотим использовать, something
но все равно сможем обрабатывать его по-разному, если это другой тип. В этом случае вы захотите использовать as
ключевое слово, чтобы определить это:
Примечание: as
оператор - это то, как вы печатаете приведение в Swift.
// 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
ключевыми словами. Как и раньше, когда мы принудительно разворачивали опциональный файл, мы использовали для этого !
оператор bang. Здесь вы будете делать то же самое, но вместо того, чтобы разыгрывать как необязательное, вы также разыгрываете его Int
. И он должен быть в состоянии быть пониженным, как Int
, в противном случае, как при использовании оператора взрыва, когда значение nil
вашего приложения потерпит крах.
И для того, чтобы использовать эти переменные вообще в некоторой сортировке или математической операции, они должны быть развернуты, чтобы сделать это.
Например, в Swift только допустимые числовые типы данных одного типа могут работать друг с другом. Когда вы приводите тип с помощью параметра, as!
вы принудительно понижаете значение этой переменной, как если бы вы были уверены, что она принадлежит к этому типу, поэтому она безопасна для работы и не приводит к сбою приложения. Это нормально, если переменная действительно того типа, к которому вы ее приводите, иначе у вас будет беспорядок.
Тем не менее приведение с помощью as!
позволит вашему коду компилироваться. Кастинг с as?
- это другая история. На самом деле, as?
объявляет вас Int
как совершенно другой тип данных все вместе.
Теперь это Optional(0)
И если вы когда-нибудь пытались сделать домашнее задание, написав
1 + Optional(1) = 2
Ваш учитель математики, вероятно, дал бы вам "F". То же самое со Свифтом. За исключением того, что Свифт предпочел бы вообще не компилировать, а не давать оценку. Потому что в конце дня необязательный может фактически быть ноль .
Безопасность первых детей.