【问题标题】:how to compare two optional NSArrays in Swift如何在 Swift 中比较两个可选的 NSArray
【发布时间】: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
}

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

【问题讨论】:

    标签: cocoa cocoa-touch swift


    【解决方案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;
        }
        

        ```

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2018-06-13
          • 2017-12-09
          • 2022-01-03
          • 1970-01-01
          • 1970-01-01
          • 2016-08-11
          相关资源
          最近更新 更多