English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Основной учебник Swift

Операторы в Swift

Контроль потоков Swift

Коллекции Swift

Функции Swift

Swift высшего уровня

Типы данных Optional в Swift

В этой статье вы узнаете о возможности, ее примерах и обработке возможностей в Swift.

В предыдущей статье мы рассмотрели различные типы данных, доступные в Swift, и также обратили внимание на то, что переменные или константы, объявленные этими типами, содержат значения по умолчанию.

Пример:}

let someValue = Int()
print(someValue)

При выполнении этой программы, вывод будет:

0

Но в Swift есть другой тип данных, называемый Optional, который по умолчанию имеет значение nil. Если вы хотите, чтобы переменная или константа не содержала никакого значения, вы можете использовать Optional. Опциональный тип может содержать значение или не содержать значения (пустое значение).

Технически вы можете считать его опциональной обувной коробкой. Коробка может содержать обувь, а может и не содержать. Поэтому, когда вы достаете обувь из коробки, вы должны знать это заранее.

Как声明 опциональный?

Вы можете просто обозначить данные как Optional, добавив ! или ? в конце типа. Если опциональная переменная содержит значение, она возвращает его как Optional <Value>, в противном случае возвращает nil.

Пример 1: как声明 опциональный в Swift?

var someValue:Int?
var someAnotherValue:Int!
print(someValue)
print(someAnotherValue)

При выполнении этой программы, вывод будет:

nil
nil

В上面 приведенной программе мы использовали ? и ! для инициализации опционального типа. Оба метода могут создавать опциональные объекты, но есть одно главное различие, которое мы обсудим ниже.

Объявление опционального Int означает, что переменная будет иметь целое значение или не будет иметь значения. Поскольку не было назначено никакого значения переменной, поэтому вы можете видеть два print-высказывания, выводящие nil.

Пример 2: назначение и доступ к значению из опционального объекта

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.

Но помните, следует использовать этот механизм распаковки только в том случае, если вы уверены, что опциональный параметр определенно имеет значение при доступе к нему.

Пример 3: явное声明 неупакованного опционального

Вы также можете создать распакованный опциональный контент следующим образом:

let someValue:Int! = 5
print(someValue)

При выполнении этой программы, вывод будет:

5

В上面的 программе, Int! создает неупакованный опциональный контент, при доступе к которому он автоматически распаковывает значение, поэтому вам не нужно использовать символ ! каждый раз.

Убедитесь, что переменные всегда имеют значение при доступе к ним при использовании этих опциональных вариантов. Если этого не сделать, это приведет к критической ошибке сбою.

Пример 4: критическая ошибка при попытке доступа к неупакованному опциональному объекту null

var someValue:Int!
var unwrappedValue:Int = someValue //сбой из-за этой строки

Когда вы запустите этот программный код, вы получите критическую ошибку, сбоем: при разборе опционального значения неожиданно обнаружено nil, потому что код unwrappedValue: Int = someValue пытается присвоить значение из Optional someValue переменной unwrappedValue.

Но somevalue - это опциональный тип, содержащий значение nil. Попытка присвоить значение nil переменной unwrappedValue (не является Optional) приведет к сбою.

Ниже будут рассмотрены различные методы обработки этой ситуации.

Обработка опций

Для использования переменных-опций необходимо их разборить. Лучшим способом использования переменных-опций является условное разборка, а не принудительное использование оператора !.

Это потому, что условное раскрытие спрашиваетПроверяется ли наличие значения у этой переменной?Если да, предоставьте это значение,否则 обработайте情况进行 nil.

Напротив, принудительное раскрытие означает, что переменная действительно имеет значение при использовании. Таким образом, когда вы принудительно раскрываете переменную nil, ваша программа выдает исключение, обнаружив nil при попытке разборки опционального значения. Ниже приведены некоторые приемы для условного раскрытия:

1. Оператор if

Вы можете использовать оператор if, чтобы сравнить опциональный параметр с nil, чтобы определить, содержит ли опциональный параметр значение. Вы можете использовать сравнительные операторы «равно» (==) или «не равно» (!=) в операторе if.

Пример 5: обработка опций с помощью оператора if else

var someValue:Int?
var someAnotherValue:Int! = 0
        
if someValue != nil {
	print("Содержит значение \(someValue!)")
}
	print("Не содержит значение")
}
        
if someAnotherValue != nil {
	print("Содержит значение \(someAnotherValue!)")
}
	print("Не содержит значение")
}

При выполнении этой программы, вывод будет:

Не содержит значение
Содержит значение 0

В вышеуказанном примере, если переменная-опция содержит значение, выполняется код в блоке if, в противном случае выполняется блок else. Основным недостатком использования этого метода для обработки опций является то, что вам все еще нужно использовать оператор ! для разборки значения из опции.

2. Выборочная привязка (if let)

Выборочная привязка может помочь вам определить, содержит ли значение переменная-опция. Если переменная-опция содержит значение, то это значение может быть использовано в качестве временной константы или переменной. Таким образом, выборочную привязку можно использовать вместе с оператором if, чтобы проверить значение внутри опции и извлечь его в качестве константы или переменной в одном действии.

Пример 5: обработка опциональных значений с помощью if let

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. Основным преимуществом этого метода является то, что вы можете определить, содержит ли опциональное значение значение, не нужно силово распаковывать его.

3. Оператор guard

Вы также можете использовать оператор guard в Swift для обработки опциональных значений. Если вы не знаете, что такое guard, не волнуйтесь. Просто рассматривайте guard как if-else без if условия. Если условие не выполняется, выполняется блок else. Если условие выполняется, выполняется следующая команда. Больше подробностей см. вSwift Guard.

Пример 6: обработка опциональных значений с помощью 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.

4. Оператор умножения (??)

В Swift вы также можете использовать оператор умножения для проверки, содержит ли опциональное значение значение. Он определен как (a??b). Он развертывает опциональное значение a, если оно содержит значение, то возвращает его, или если a пусто, то возвращает значение по умолчанию b.

Пример 7: обработка опциональных значений с помощью оператора умножения

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.