Я пытаюсь иметь словарь, который имеет строку как ключ и массив строки в качестве значения.
Тогда я хочу, чтобы проверить, если 2 из этих словарей, равны примерно так:Swift Словарь равенства массива строки
let dicOfStringStringAr1: [String : [String]] = ["key1" : ["val", "for key 1"]]
let dicOfStringStringAr2: [String : [String]] = ["key1" : ["val", "for key 1"]]
if dicOfStringStringAr1 == dicOfStringStringAr2 {
print("Dictionary of String Array")
}
Но я получаю эту ошибку:
error: binary operator '==' cannot be applied to two '[String : [String]]' operands
Но если значение строки вместо [String] это работает ,
let dicOfStringAr1: [String : String] = ["key1" : "val"]
let dicOfStringAr2: [String : String] = ["key1" : "val"]
if dicOfStringAr1 == dicOfStringAr2 {
print("Dictionary of String Array")
}
Я не понимаю проблемы.
Кто-то может объяснить, в чем проблема.
После просмотра по умолчанию == Swift функция словаря
@warn_unused_result
public func ==<Key : Equatable, Value : Equatable>(lhs: [Key : Value], rhs: [Key : Value]) -> Bool
я понял, что нет никакого определения, где значение представлено в виде массива, а также о том, что «общее» Значение не может быть разрешенным к коллекции. (Не знаете, почему).
Итак, я сделал функцию ==, которая имела бы параметры [Key: [Value]]. И теперь код работает.
@warn_unused_result
public func ==<Key : Equatable, Value : Equatable>(lhs: [Key : [Value]], rhs: [Key : [Value]]) -> Bool {
var result = lhs.count == rhs.count
for (k, v) in lhs {
guard let arValue = rhs[k] where result == true else {
result = false
break
}
result = v == arValue
}
return result
}
Может кто-нибудь объяснить, почему в реализации Swift == значение не может быть разрешено для одного элемента, являющегося массивом?
интересная идея, как бы вы реализовали свою функцию == как универсальную и безопасную для типа. Я пробовал '==', чтобы ограничить доступ к функции только массивом, который мог бы сравните с ==, но также должны иметь '== ' для соответствия протокола. Проблема в том, что последний используется, поэтому я всегда получаю false. –
Я расскажу о другом вопросе позже, чтобы изучить возможность того, чтобы эта работа была общей. Я добавлю новый комментарий, когда это будет сделано, если у вас есть идеи об этом. –
Обновлен мой ответ. –