Я использую Xcode 6 Beta 4. У меня странная ситуация, когда я не могу понять, как правильно протестировать дополнительные компоненты.
Если у меня есть дополнительный xyz, это правильный способ проверки:
if (xyz) // Do something
или
if (xyz != nil) // Do something
В документах говорится, что делать это первым способом, но я обнаружил, что иногда требуется второй способ, и он не генерирует ошибку компилятора, но в других случаях второй способ генерирует ошибку компилятора.
Мой конкретный пример - использование синтаксического анализатора GData XML, соединенного с помощью swift:
let xml = GDataXMLDocument(
XMLString: responseBody,
options: 0,
error: &xmlError);
if (xmlError != nil)
Вот если бы я только что сделал:
if xmlError
это всегда вернет истину. Однако, если я сделаю:
if (xmlError != nil)
тогда это работает (как, как это работает в Objective-C).
Есть ли что-то с GData XML и тем, как он обрабатывает необязательные параметры, которые мне не хватает?
Ответы:
В Xcode Beta 5 они больше не позволяют вам:
Это приводит к ошибке:
Вы должны использовать одну из этих форм:
источник
Чтобы добавить к другим ответам вместо назначения переменной с другим именем внутри
if
условия:вы можете использовать одно и то же имя переменной следующим образом:
Это может помочь вам избежать исчерпания творческих имен переменных ...
Это использует преимущество затенения переменных , которое поддерживается в Swift.
источник
Одним из наиболее прямых способов использования опциональных программ является следующее:
Предполагается, что
xyz
это необязательный тип, какInt?
например.Таким образом, вы можете одновременно проверить,
xyz
содержит ли значение, и если да, немедленно поработать с этим значением.Что касается ошибки вашего компилятора, тип
UInt8
не является обязательным (обратите внимание, нет '?') И поэтому не может быть преобразован вnil
. Убедитесь, что переменная, с которой вы работаете, является необязательной, прежде чем рассматривать ее как единое целое.источник
Swift 3.0, 4.0
Есть в основном два способа проверки необязательных значений на ноль. Вот примеры со сравнением между ними
1. если позволено
if let
это самый простой способ проверить опционально на ноль. К этой нулевой проверке могут быть добавлены другие условия, разделенные запятой. Переменная не должна быть равна нулю, чтобы перейти к следующему условию. Если требуется только проверка на ноль, удалите дополнительные условия в следующем коде.Кроме этого, если
x
не ноль, то закрытие if будет выполнено иx_val
будет доступно внутри. В противном случае происходит закрытие else.2. охранник пусть
guard let
может делать подобные вещи. Его главная цель - сделать это логически более разумным. Это все равно что сказать, что переменная не nil, иначе остановите функцию .guard let
Также можно выполнить дополнительную проверку состояния какif let
.Различия в том, что развернутое значение будет доступно в той же области
guard let
, что и показано в комментарии ниже. Это также приводит к тому , что в остальном закрытия, программа должна выйти из текущей области путемreturn
,break
и т.д.источник
Из быстрого руководства по программированию
Так что лучший способ сделать это
и если вы используете
xyz
оператор if if.Than, вы можете развернутьxyz
оператор if в константной переменной. Так что вам не нужно развертывать каждое место в операторе if, гдеxyz
он используется.Это соглашение предложено,
apple
и за ним последуют разработчики.источник
if xyz != nil {...}
.Несмотря на то, что вы все равно должны явно сравнивать
nil
необязательную привязку или использовать необязательную привязку для дополнительного извлечения ее значения (т. Е. Необязательные неявно не преобразуются в логические значения), стоит отметить, что Swift 2 добавилguard
оператор, чтобы помочь избежать пирамиды гибели при работе с несколькими необязательными значениями.Другими словами, ваши опции теперь включают явную проверку
nil
:Опциональная привязка:
И
guard
заявления:Обратите внимание, что обычное необязательное связывание может привести к большему отступу, если имеется более одного необязательного значения:
Вы можете избежать этого вложения с
guard
заявлениями:источник
nil
значение, но я согласен , что кривая обучения немного крутой. :)Расширение протокола Swift 5
Вот подход, использующий расширение протокола, так что вы можете легко встроить дополнительную проверку nil:
использование
источник
swift
аналог того,pythonistas
что пытается сохранить язык в какой-то форме питонской чистоты. Мой взять? Я просто поднял твой код в мой миксин Utils.Теперь вы можете быстро выполнить следующее, что позволит вам немного восстановить цель.
if nil else
источник
Вместо этого
if
, троичный оператор может пригодиться, если вы хотите получить значение, основанное на том, является ли что-то нулем:источник
xyz == nil
выражение не работает, ноx != nil
работает. Не знаю почему.Другой подход, помимо использования
if
илиguard
операторов для выполнения необязательного связывания, заключается в расширенииOptional
с помощью:ifValue
получает замыкание и вызывает его со значением в качестве аргумента, если необязательным является не ноль. Используется так:Вы, вероятно, должны использовать
if
или, тем неguard
менее, так как это наиболее традиционные (знакомые) подходы, используемые программистами Swift.источник
Одна из опций, которая не была специально рассмотрена, - это использование синтаксиса игнорируемых значений Swift:
Мне это нравится, потому что проверка
nil
чувствуется неуместно в современном языке, таком как Swift. Я думаю, что причина, по которой это кажется неуместным, заключается в том, чтоnil
это в основном дозорная ценность. Мы покончили с дозорными в современном программировании почти везде, поэтому намnil
кажется, что так должно быть.источник
Также вы можете использовать
Nil-Coalescing Operator
Если
optionalValue
естьnil
, он автоматически присваивает значениеdefaultValue
источник
Этот тест работал, как и ожидалось, во всех случаях. Кстати, вам не нужны скобки
()
.источник
if (xyz != nil)
.Если у вас есть условия, и вы хотели бы развернуть и сравнить, как насчет того, чтобы воспользоваться преимуществами оценки сложного логического выражения при коротком замыкании, как в
Конечно, это не так легко читается, как некоторые другие предлагаемые посты, но выполняет работу и несколько кратко, чем другие предлагаемые решения.
источник