如何在Swift中比较两个可选的NSArrays

时间:2015-02-03 19:34:13

标签: cocoa cocoa-touch swift

让我们有两个可选的NSArrays。目标是检查它们是否相等。我的解决方案是

func isArrayEqualToArray(array1:NSArray?, array2:NSArray?) -> Bool {

    let areBothEmpty:Bool = array1 == nil && array2 == nil

    var areBothEqual:Bool
    if !areBothEmpty && array2 != nil {
        areBothEqual = array1?.isEqualToArray(array2!) ?? false
    } else {
        areBothEqual = false
    }

    let result = areBothEqual || areBothEmpty
    return result
}

我觉得它有点过于冗长。它应该以更简洁和可读的方式实现。有没有人有更好的解决方案?

4 个答案:

答案 0 :(得分:5)

这很简单:

func isArrayEqualToArray(array1: NSArray?, array2: NSArray?) -> Bool {
    return array1 == array2
}

完全符合您的要求。

为什么会有效?此处==是比较选项的运算符

func ==<T : Equatable>(lhs: T?, rhs: T?) -> Bool

如果两个操作数均为true,则为nil 操作数是非零的,未打开的操作数是相等的。

同样NSArray继承自符合NSObject的{​​{1}}, 并将EquatableNSObject进行比较时使用的是==方法 在isEqual:上以isEqualToArray:实施。 因此

NSArray

给出与

相同的结果
array1 == array2

答案 1 :(得分:1)

是的,确实,你不需要过度复杂化:

func isArrayEqualToArray(array1: NSArray?, array2: NSArray?) -> Bool {
    if array1 == nil && array2 == nil {
        return true;
    }

    if array1 != nil && array2 != nil {
        return array1!.isEqualToArray(array2!);
    }

    return false;
}

答案 2 :(得分:0)

使用switch语句可能更清楚:

func isArrayEqualToArray(a1: NSArray?, a2: NSArray?) -> Bool {
    switch (a1,a2) {
        case (.Some(a1),.Some(a2)):
            return a1.isEqualToArray(a2)
        case (.None,.None):
            return true
        default:
            return false
    }
}

答案 3 :(得分:0)

我喜欢@The Paramagnetic Croiss的答案,但我仍然会稍微缩短它,因为我看到我可以。

```

func isArrayEqualToArray(array1: NSArray?, array2: NSArray?) -> Bool {
    if array1 == array2 {
        return true;
    }
    if array1 != nil && array2 != nil {
        return array1!.isEqualToArray(array2!);
    }
    return false;
}

```