Swift Dictionary of string的数组相等

时间:2016-02-25 04:22:30

标签: arrays swift dictionary equality

我正在尝试使用字符串将字符串作为键并将字符串数组作为值 然后我想检查这些词典中的两个是否相同:

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")
}

但是我收到了这个错误:

  

错误:二元运算符'=='不能应用于两个'[String:[String]]'操作数

但是如果值是String而不是[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

我意识到没有定义将Value表示为数组,并且“泛型”值无法解析为集合。 (不知道为什么) 所以我创建了一个具有[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中==实现Value无法解析为单个项目,是一个数组吗?

2 个答案:

答案 0 :(得分:1)

这实际上是有道理的。正如您在类型==的{​​{1}}函数中所看到的,它需要<Key : Equatable, Value : Equatable>来符合Value。默认情况下,Equatable类型不符合Array请注意,这并不意味着您无法使用Equatable比较两个数组。

==

符合[1, 2, 3] == ["a", "b", "c"] // false. 表示您可以使用Equatable,但不能反复使用。

您当然可以将==类型扩展为符合Array

Equatable

<强>更新

我想说现在不可能为extension Array: Equatable {} // Implement the following method. public func ==<T: CollectionType, U: CollectionType>(lhs: T, rhs: U) -> Bool {} 实施合理的==。 (有可能在future swift version

对于您的具体情况,我会说以下方法是公平的。如果您拥有自定义Array,请确保其符合struct

Equatable

示例是:

public func  ==<Key : Equatable, Value : CollectionType where Value.Generator.Element: Equatable>(lhs: [Key : Value], rhs: [Key : Value]) -> Bool {
    guard lhs.keys.elementsEqual(rhs.keys) else { return false }

    for (key, value) in lhs {
        if !value.elementsEqual(rhs[key]!) { return false }
    }

    return true
}

答案 1 :(得分:0)

幸运的是,您可以通过将字典转换为NSDictionary并使用其方法isEqualToDictionary来检查这些字典是否相同。例如:

if NSDictionary(dictionary: dicOfStringStringAr1).isEqualToDictionary(dicOfStringStringAr2) {
    print("Dictionary of String Array")
}