compactMapValues ​​не фильтрует нулевые значения - PullRequest
0 голосов
/ 20 апреля 2020

compactMapValues в словаре возвращает словарь со значениями nil.

Я использую метод, предложенный в большинстве документации. compactMapValues { $0 }

extension Dictionary where Key == RequestParameter {

    func nilFiltered() -> [RequestParameter: Any] {
        return compactMapValues { $0 }
    }

}

RequestParameter является перечислением, и я вызываю метод как ..

[RequestParameter.param1: "value1", RequestParameter.param2: nil]. nilFiltered()

Необходимая фильтрация не происходит. Это известная ошибка или я что-то не так делаю?

1 Ответ

3 голосов
/ 20 апреля 2020

Если вы просто вернете $0, это добавляет уровень опциональности. Возвращаемое значение

[RequestParameter.param1: "value1", .param2: nil]

равно [RequestParameter: String?], что вводит двойную опциональность. Либо сделайте это:

extension Dictionary {
  func nilFiltered<Wrapped>() -> [Key: Any] where Value == Wrapped? {
    compactMapValues { $0 }
  }
}

или если вам на самом деле не нужен Any, избегайте этого рубина sh!

extension Dictionary {
  func nilFiltered<Wrapped>() -> [Key: Wrapped] where Value == Wrapped? {
    compactMapValues { $0 }
  }
}

Вот альтернатива, которая мне не нравится .

extension Dictionary {
  func nilFiltered() -> [Key: Any] {
    compactMapValues {
      if case nil as Value? = $0 {
        return nil
      }

      return $0
    }
  }
}
...