Ключевые слова: необязательно, карта, плоская карта, функтор
Есть ряд случаев, когда мы хотели бы инициализировать объект с некоторыми параметрами, но то, что у нас сейчас есть (т. е. эти параметры), к сожалению, имеет необязательный тип. Например, у нас есть 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 в Необязательно.
И вот как мы его используем:
Развлекайся!