Как compactMapValues обрабатывает значение, преобразованное в nil, при сохранении типа Dictionary?
compactMapValues удаляет из результата пары, для которых преобразование вернуло nil. Для остальных ключей он сохраняет пары в виде Dictionary, причём итоговый тип значения становится не optional.
Обычный map естественно применяется к последовательности элементов, но словарь должен сохранять связь между ключом и значением. Поэтому стандартная библиотека предоставляет специализированные операции: mapValues изменяет только значения, а compactMapValues дополнительно позволяет отбрасывать пары с недопустимым результатом.
Такой подход решает типичную задачу очистки или нормализации словаря без промежуточного преобразования его в массив пар и последующей ручной сборки нового словаря.
Допустим, значения словаря нужно преобразовать, но часть из них не проходит проверку. Если использовать mapValues, результатом будут значения типа Optional, а исходные ключи сохранятся даже там, где полезного значения нет.
Ручная фильтрация через пары требует отдельно проверять результат преобразования, сохранять ключ и заново формировать словарь. Ошибка в таком коде может привести к сохранению недействительных записей или к избыточным промежуточным структурам.
Замыкание compactMapValues получает каждое значение словаря и возвращает optional-результат. Если результат равен nil, соответствующая пара ключ–значение не включается в новый словарь. Если результат содержит значение, в словарь попадает пара с тем же ключом и распакованным значением.
Тип settings — [String: Int], а не [String: Int?]. Ключи исходного словаря не преобразуются, поэтому тип ключа сохраняется; преобразованию подвергаются только значения.
Метод возвращает новый словарь и не изменяет исходный. Порядок обхода и отображения элементов словаря не следует использовать как часть логики: Dictionary не предоставляет гарантии стабильного порядка между запусками.
Главный компромисс — удобство против контроля. compactMapValues краток и точно выражает правило «отбросить значение при nil», но если нужно собирать ошибки, логировать причины отбрасывания или обрабатывать ключи, потребуется более явный алгоритм.
Сервис получает словарь параметров конфигурации в виде строк. Часть параметров должна быть целым числом, а неизвестные или некорректные значения нужно исключить перед передачей конфигурации дальше.
Можно применить mapValues, но тогда каждый результат будет optional, и потребителям придётся повторно разбирать optionals. Можно преобразовать словарь в массив пар, использовать compactMap, а затем создать словарь — это даёт больше контроля, но добавляет промежуточную структуру и усложняет код.
Выбор compactMapValues оправдан, если некорректные записи нужно просто исключить. В результате получается сразу словарь с конкретным типом значений, а исходная конфигурация остаётся неизменной.
Если же требования изменятся и понадобится сообщать пользователю, какие ключи были отброшены, одного compactMapValues будет недостаточно: преобразование следует сделать явно с накоплением успешных значений и ошибок.
Нет. Возвращённый nil означает, что вся пара удаляется из результата, а не что в словаре сохраняется ключ с optional-значением. Поэтому результат имеет неoptional-тип значения.
mapValues сохраняет все ключи и превращает каждый результат в новое значение, даже если замыкание возвращает optional. Например, преобразование к Int? даст словарь типа [Key: Int?]. compactMapValues исключает пары с nil и возвращает [Key: Int] для успешно преобразованных значений.
Нет. Оба случая обычно выражаются возвратом nil и приводят к удалению пары. Если причины нужно различать, следует использовать явный результат преобразования, например возвращать структуру с результатом и диагностикой, а затем отдельно формировать словарь и список ошибок.