English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
В этой статье вы узнаете о возможности, ее примерах и обработке возможностей в Swift.
В предыдущей статье мы рассмотрели различные типы данных, доступные в Swift, и также обратили внимание на то, что переменные или константы, объявленные этими типами, содержат значения по умолчанию.
Пример:}
let someValue = Int() print(someValue)
При выполнении этой программы, вывод будет:
0
Но в Swift есть другой тип данных, называемый Optional, который по умолчанию имеет значение nil. Если вы хотите, чтобы переменная или константа не содержала никакого значения, вы можете использовать Optional. Опциональный тип может содержать значение или не содержать значения (пустое значение).
Технически вы можете считать его опциональной обувной коробкой. Коробка может содержать обувь, а может и не содержать. Поэтому, когда вы достаете обувь из коробки, вы должны знать это заранее.
Вы можете просто обозначить данные как Optional, добавив ! или ? в конце типа. Если опциональная переменная содержит значение, она возвращает его как Optional <Value>, в противном случае возвращает nil.
var someValue:Int? var someAnotherValue:Int! print(someValue) print(someAnotherValue)
При выполнении этой программы, вывод будет:
nil nil
В上面 приведенной программе мы использовали ? и ! для инициализации опционального типа. Оба метода могут создавать опциональные объекты, но есть одно главное различие, которое мы обсудим ниже.
Объявление опционального Int означает, что переменная будет иметь целое значение или не будет иметь значения. Поскольку не было назначено никакого значения переменной, поэтому вы можете видеть два print-высказывания, выводящие nil.
let someValue:Int? = 5 print(someValue) print(someValue!)
При выполнении этой программы, вывод будет:
Optional(5) 5
В上面的 программе мы объявили опциональный тип Int и в нем назначили значение 5.
Если вы напечатаете опциональный someValue, он не вернет 5, а вместо этого вернет Optional(5). Он имеет следующий вид: Optional <Value>. Чтобы получить доступ к <Value>, нам нужно что-то叫 unpacking (распаковка)механизма.
Вы можете расширить опциональный контент, добавив символ ! в конце переменной/константы, как показано в следующей строке: print(someValue!). print(someValue!) распаковывает опциональный контент и выводит на экран 5.
Но помните, следует использовать этот механизм распаковки только в том случае, если вы уверены, что опциональный параметр определенно имеет значение при доступе к нему.
Вы также можете создать распакованный опциональный контент следующим образом:
let someValue:Int! = 5 print(someValue)
При выполнении этой программы, вывод будет:
5
В上面的 программе, Int! создает неупакованный опциональный контент, при доступе к которому он автоматически распаковывает значение, поэтому вам не нужно использовать символ ! каждый раз.
Убедитесь, что переменные всегда имеют значение при доступе к ним при использовании этих опциональных вариантов. Если этого не сделать, это приведет к критической ошибке сбою.
var someValue:Int! var unwrappedValue:Int = someValue //сбой из-за этой строки
Когда вы запустите этот программный код, вы получите критическую ошибку, сбоем: при разборе опционального значения неожиданно обнаружено nil, потому что код unwrappedValue: Int = someValue пытается присвоить значение из Optional someValue переменной unwrappedValue.
Но somevalue - это опциональный тип, содержащий значение nil. Попытка присвоить значение nil переменной unwrappedValue (не является Optional) приведет к сбою.
Ниже будут рассмотрены различные методы обработки этой ситуации.
Для использования переменных-опций необходимо их разборить. Лучшим способом использования переменных-опций является условное разборка, а не принудительное использование оператора !.
Это потому, что условное раскрытие спрашиваетПроверяется ли наличие значения у этой переменной?Если да, предоставьте это значение,否则 обработайте情况进行 nil.
Напротив, принудительное раскрытие означает, что переменная действительно имеет значение при использовании. Таким образом, когда вы принудительно раскрываете переменную nil, ваша программа выдает исключение, обнаружив nil при попытке разборки опционального значения. Ниже приведены некоторые приемы для условного раскрытия:
Вы можете использовать оператор if, чтобы сравнить опциональный параметр с nil, чтобы определить, содержит ли опциональный параметр значение. Вы можете использовать сравнительные операторы «равно» (==) или «не равно» (!=) в операторе if.
var someValue:Int? var someAnotherValue:Int! = 0 if someValue != nil { print("Содержит значение \(someValue!)") } print("Не содержит значение") } if someAnotherValue != nil { print("Содержит значение \(someAnotherValue!)") } print("Не содержит значение") }
При выполнении этой программы, вывод будет:
Не содержит значение Содержит значение 0
В вышеуказанном примере, если переменная-опция содержит значение, выполняется код в блоке if, в противном случае выполняется блок else. Основным недостатком использования этого метода для обработки опций является то, что вам все еще нужно использовать оператор ! для разборки значения из опции.
Выборочная привязка может помочь вам определить, содержит ли значение переменная-опция. Если переменная-опция содержит значение, то это значение может быть использовано в качестве временной константы или переменной. Таким образом, выборочную привязку можно использовать вместе с оператором if, чтобы проверить значение внутри опции и извлечь его в качестве константы или переменной в одном действии.
var someValue:Int? var someAnotherValue:Int! = 0 if let temp = someValue { print("Содержит значение \(temp)") } print("Не содержит значение") } if let temp = someAnotherValue { print("Содержит значение \(temp)") } print("Не содержит значение") }
При выполнении этой программы, вывод будет:
Не содержит значение Содержит значение 0
В上面的 программе, если опциональное значение содержит значение, выполняется код в блоке if. В противном случае выполняется блок else. Если-let также автоматически распаковывает значение и хранит его в переменной temp. Основным преимуществом этого метода является то, что вы можете определить, содержит ли опциональное значение значение, не нужно силово распаковывать его.
Вы также можете использовать оператор guard в Swift для обработки опциональных значений. Если вы не знаете, что такое guard, не волнуйтесь. Просто рассматривайте guard как if-else без if условия. Если условие не выполняется, выполняется блок else. Если условие выполняется, выполняется следующая команда. Больше подробностей см. вSwift Guard.
func testFunction() { let someValue:Int? = 5 guard let temp = someValue else { return } print("It has some value \(temp)") } testFunction()
При выполнении этой программы, вывод будет:
It has some value 5
В上面的程序е, guard содержит условие, то есть опциональное значение someValue содержит ли значение. Если оно содержит значение, то guard-let автоматически распаковывает это значение и ставит его в переменную temp. В противном случае, будет выполнен блок else, и он вернется к функции вызова. Поскольку опциональное значение содержит значение, вызывается функция print. Больше подробностей см. в Swift guard.
В Swift вы также можете использовать оператор умножения для проверки, содержит ли опциональное значение значение. Он определен как (a??b). Он развертывает опциональное значение a, если оно содержит значение, то возвращает его, или если a пусто, то возвращает значение по умолчанию b.
var someValue:Int! let defaultValue = 5 let unwrappedValue: Int = someValue ?? defaultValue print(unwrappedValue)
При выполнении этой программы, вывод будет:
5
В вышеупомянутой программе, переменная someValue определена как опциональная и содержит значение nil. Оператор безопасного извлечения не может извлечь значение из опционального значения, поэтому возвращает defaultValue. Поэтому, предложение print(unwrappedValue) выводит 5 в консоли.
var someValue: Int? = 10 let defaultValue = 5 let unwrappedValue: Int = someValue ?? defaultValue print(unwrappedValue)
При выполнении этой программы, вывод будет:
10
Однако, в вышеупомянутом программном обеспечении, переменная-опционал someValue была инициализирована значением 10. Поэтому, оператор безопасного извлечения успешно извлек это значение someValue. Поэтому, это предложение в консоли someValue ?? defaultValue возвращает 10, предложение print(unwrappedValue) выводит 10.