Сравнение словарей при исключении определенных ключей - PullRequest
0 голосов
/ 15 мая 2018

У меня есть 2 словаря:

let foo: [String: Any] = ["name": "John", "isHuman": true, "age": 20]
let bar: [String: Any] = ["name": "Ann", "isHuman": true, "age": 34]

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

let car: [String: Any] = ["age": 20]

У меня есть это расширение:

extension Dictionary where Key: Equatable {
    func isEqualTo(_ dictionary: Dictionary, excluding: [Key] = []) -> Bool {
      let left = filter({ !excluding.contains($0.key) })
      let right = dictionary.filter({ !excluding.contains($0.key) })
      return NSDictionary(dictionary: left).isEqual(to: right)
    }
}

, но когда я его вызываю, мне нужно заключить исключенные ключи в Array, иначе компилятор завершится с ошибкой:

Невозможно преобразовать значение типа 'Dictionary.Keys' в ожидаемый тип аргумента '[String]'

foo.isEqualTo(bar, excluding: Array(car.keys)) работает.

foo.isEqualTo(bar, excluding: car.keys) приводит к ошибке компилятора.

Могу ли я настроить свое расширение таким образом, чтобы я мог избежать включения исключенных ключей в Array?

Ответы [ 2 ]

0 голосов
/ 15 мая 2018

car.keys имеет тип Dictionary<Key, Value>.Keys, который является коллекцией , а не массивом.

Если вы объявите функцию как

func isEqualTo<C: Collection>(_ dictionary: Dictionary, excluding: C) -> Bool
        where C.Element == Key

, тогдаоба

foo.isEqualTo(bar, excluding: Array(car.keys))
foo.isEqualTo(bar, excluding: car.keys)

компилируются и работают.

0 голосов
/ 15 мая 2018

Объявите excluding типа Keys.

func isEqualTo(_ dictionary: Dictionary, excluding: Keys = [:].keys) -> Bool {

В качестве примечания можно исключить использование NSDictionary, обновив код как:

let foo: [String: AnyHashable] = ["name": "John", "isHuman": true, "age": 20]
let bar: [String: AnyHashable] = ["name": "Ann", "isHuman": true, "age": 34]

let car: [String: Any] = ["age": 20, "name":"Bob"]

extension Dictionary where Key: Equatable, Value: Equatable {
    func isEqualTo(_ dictionary: Dictionary, excluding: Keys = [:].keys) -> Bool {
        let left = filter({ !excluding.contains($0.key) })
        let right = dictionary.filter({ !excluding.contains($0.key) })
        return left == right
    }
}

Обратите внимание на использование AnyHashable вместо Any для словарей и обратите внимание на добавленный , Value: Equatable в расширении.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...