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

Posted

技术标签:

【中文标题】如何在 Swift 中比较两个可选的 NSArray【英文标题】:how to compare two optional NSArrays in Swift 【发布时间】:2015-02-03 19:34:13 【问题描述】:

让我们有两个可选的 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

我觉得有点太啰嗦了。它应该以更简洁和可读的方式可行。谁有更好的解决方案?

【问题讨论】:

【参考方案1】:

很简单:

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

完全按照你的意愿去做。

为什么会起作用?这里==是比较可选的操作符

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

如果两个操作数都是nil,或者两者都是true 操作数非零且展开的操作数相等。

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

array1 == array2

给出与

相同的结果
array1.isEqualToArray(array2)

【讨论】:

... 这比在 Objective-C 中要好得多,因为这种事情很痛苦。【参考方案2】:

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

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;

【讨论】:

【参考方案3】:

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

【讨论】:

【参考方案4】:

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

```

【讨论】:

以上是关于如何在 Swift 中比较两个可选的 NSArray的主要内容,如果未能解决你的问题,请参考以下文章

Swift:如果变量 a 是非可选的,那么为啥变量 b 是可选的? [复制]

在swift中,为什么UIlabel是可选的?

Swift5.4 中可选的误报

在 swift 4.0 中从 firebase 快照字典中获取值时打开一个可选的 nil

Swift 3 更好的方式来解开一个可选的

Swift、Core Data、可选的 Integer16 和 keyPath