如何比较 Swift 中的两个可选 NSArray

how to compare two optional NSArrays in Swift

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

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
}

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

是的,的确,你不需要把事情复杂化:

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;
}

使用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
    }
}

很简单:

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

完全符合您的要求。

为什么起作用?这里==是比较optionals的运算符

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

如果两个操作数都是 nil 或两者兼而有之,则给出 true 操作数非零且展开的操作数相等。

NSArray继承自NSObject,符合Equatable, 并将 NSObjects 与 == 进行比较使用 isEqual: 方法,即 在 NSArray 上实施为 isEqualToArray:。 因此

array1 == array2

给出与

相同的结果
array1.isEqualToArray(array2)

我喜欢@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;
}

```