Swift indexOf行为不一致

时间:2016-08-03 10:52:04

标签: arrays swift indexof nsobject equatable

我似乎面临与Swift的indexOf功能不一致的行为。

Swift中有两个indexOf函数:
1.第一个以Equatable为参数:array.indexOf(obj)
2.第二个将匹配闭包作为参数:array.indexOf{$0 == obj}

我有一个NSObject子类,其中定义了==运算符,即它符合Equatable,因此,我假设两个函数完全相同(在示例中使用闭包)

但是,1st方法的行为不一致,特别是在使用object调用时返回nil,其实例在数组中不存在。

为了说明问题,我提供了带注释的示例代码:

class EqObj: NSObject {
  let value: Int
  init(value: Int) {
    self.value = value
  }
}

func ==(lhs: EqObj, rhs: EqObj) -> Bool{
  return lhs.value == rhs.value
}

var array = [Obj(value: 1), Obj(value: 3), Obj(value: 5)]
var object = Obj(value: 5)

// returns nil, should return 2 - incorrect
array.indexOf(object) // Instance is not present
// returns 2, correct
array.indexOf(array.last!) // Instance is present
// returns 2, correct
array.indexOf{$0 == object} // Instance is not present, predicate
// returns non-empty array, correct
array.filter{$0 == object} // Instance is not present, predicate

该问题仅适用于NSObject子类。当我将Obj: NSObject更改为Obj: Equatable时,方法indexOf()完全按预期工作,即返回2

问题是这是否可以被视为错误?

我的假设是array.indexOf(object)调用isEqual的{​​{1}}方法,而不是我的重载NSObject运算符。

我的解决方案: 我使用==

1 个答案:

答案 0 :(得分:0)

首先,根据这个定义,我得到了不同的结果

class Obj: NSObject {
    let value: Int

    init(value:Int) {
        self.value = value
    }
}

func ==(lhs: Obj, rhs: Obj) -> Bool{
    return lhs.value == rhs.value
}

var array = [Obj(value: 1), Obj(value: 3), Obj(value: 5)]
var object = Obj(value: 5)

这里是

enter image description here

您可以在下面阅读每个结果后的原因

结果#1

array.indexOf(object) // nil
  

在这种情况下,使用isEqual方法,因此您只是比较内存地址。由于object var引用了数组中的对象 NOT ,因此结果为nil

结果#2

array.indexOf(array.last!) // 2
  

再次使用isEqual。但是在这里,您将向indexOf传递对数组中最后一个对象的引用,以便它可以工作。

结果#3

array.indexOf { $0 == object } // 2
  

在此明确使用您定义的==运算符,以便使用value属性。

结果#4

array.filter { $0 == object } // [{NSObject, value 5}]
  

再次使用==运算符,然后使用value属性检查是否相等。