Site icon AppTractor

5 вещей о Optional в Swift, которые всех сбивают с толку

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

Если вы обнаруживали nil и развертывали его с помощью optional для обработки, это значит, что вы знакомы с таким типом переменных.

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

1. ? против !

Есть два способа сделать переменную optional с помощью ? и !, но каждый из них имеет разное значение.

?

Когда вы делаете любую переменную необязательной (optional) с помощью ?, это означает, что вам также придётся обрабатывать значение nil.

var name: String?

if let name = name {
    print("Hello, \(name)")
} else {
    print("No name found.")
}

Здесь мы использовали if-let для обработки имени. Если имя равно nil, выполняется блок else; в противном случае выполняется блок if.

!

Когда вы создаёте переменную с помощью !, это означает, что вам не нужно обрабатывать значение nil.

var userId: String!

print(userId.count)

Код выполняется успешно, но если значение равно нулю, приложение аварийно завершает работу.

Примечание. Используйте !, если вы уверены, что заданное значение не будет равно нулю, даже если оно объявлено как optional.

2. Цепочка optional переменных не останавливает выполнение

С помощью цепочки необязательных переменных (?) вы можете безопасно выполнить код с необязательной переменной.

let size = user?.name.count

Этот код работает нормально, даже если имя равно нулю. Всё выражение возвращает nil, но не приводит к крешу.

Необязательная цепочка (Optional Chaining) не остановит выполнение программы, если значение равно нулю. Взгляните на этот пример:

user?.logout() 
print("Done!")

Если user равен нулю, функция выхода из системы не будет вызвана, но приведенный ниже код будет выполнен.

3. if let — не всегда лучший выбор

if-let полезен для управления нулевыми значениями, но иногда он может сделать код более сложным и запутанным.

if let name = data?.name {
    if let city = data?.address?.city {
        print("\(name) lives in \(city)")
    }
}

Это затрудняет чтение вложенного кода.

Лучший способ:

guard let name = data?.name,
  let city = data?.address?.city else {
  return
}

print("\(name) lives in \(city)")

Еще лучший способ:

let city = data?.address?.city ?? "Unknown City"

4. Двойной optional (??)

Вы уже знакомы с таким кодом:

var name: String? = "Jayant"

Переменная name имеет строковое значение или может быть равна нулю.

Но видели ли вы что-то подобное?

let value: String?? = "Jayant"

Это называется Double Optional (??). Читается как Optional(optional("Jayant")).

Основной вариант использования — когда вы возвращаете необязательный параметр из функции и присваиваете эту функцию любой переменной, которая также возвращает optional параметр.

func getName() -> String? {
    return nil
}

let name: String?? = getName()

Здесь функция getName() возвращает String?, а при назначении имени вы пишете String??, что означает optional, содержащую другую optional строку.

5. Optional коллекции — это не то же самое, что пустые

Взгляните на этот код:

var names: [String]? = []

На первый взгляд кажется, что это просто пустой массив, но на самом деле это optional массив, содержащий внутри себя пустой массив.

Необязательный массив может находиться в различных состояниях.

var names: [String]? = nil   // it's not an array
var names: [String]? = []    // Array exists, but it’s empty
var names: [String]? = ["Jayant", "Neha"] // Array with values

Давайте посмотрим, что произойдет, если вы это проверите:

var names: [String]? = []

if names != nil {
    print("Array exists")
}

// output ---> Array exists

Как видите, массив существует и пуст.

Спасибо, что дочитали до конца.

Источник

Exit mobile version