Ключевые слова: необязательно, карта, плоская карта, функтор

Есть ряд случаев, когда мы хотели бы инициализировать объект с некоторыми параметрами, но то, что у нас сейчас есть (т. е. эти параметры), к сожалению, имеет необязательный тип. Например, у нас есть urlString с типом String? (или Optional‹String›), и мы хотим получить url из urlString.

По сути, мы ожидаем получить url NSURL? (или необязательно‹NSURL›). Если urlString == nil, url также должен быть равен nil.

Однако для инициализации NSURL требуется строка из String (который уже развернут).

Вот очень популярный способ справиться с этой несовместимостью типов:

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

Это выглядит приемлемо, но:

  • Для такого случая нужно добавить несколько строк кода
  • Единственная причина изменить URL-адрес с неизменяемого на изменяемый (с let… на var…) — просто несовместимость типов

Карта спешит на помощь

К счастью, у нас есть функция map в разделе Необязательно. (Если Swift не поддерживает, мы можем это определить :D). Я совершенно уверен, что вы также часто использовали map в массиве, верно?

Для лучшего понимания я удалил некоторые ненужные ключевые слова, не имеющие прямого отношения к данной теме.

Теперь мы можем инициировать объект с параметром Optional, например:

Конечно, мы могли бы использовать этот совет с другими функциями, кроме инициализации.

Как насчет функции с двумя параметрами?

fetchDataFromPath(path: String, withToken: String)

Мы можем придумать идею превратить 2 option в необязательный элемент Tuple. Давайте определим оператор ‹&› для объединения двух опций.

Или мы могли бы определить его более лаконично, используя flatMap в Необязательно.

И вот как мы его используем:

Развлекайся!