如何让Objective-C类符合Swift的“Equatable”协议?

时间:2015-06-19 02:31:27

标签: objective-c swift protocols language-interoperability

我有一个Objective-C类(恰好是一个按钮,但这并不重要),而在我(混合语言)项目的另一部分,我有一个这些按钮的数组,我就是这样喜欢使用find()方法获取按钮的索引。像这样:

func doSomethingWithThisButtonIndex(index:Int)
{
    let buttons = [firstButton, secondButton, thirdButton]
    if index == find(buttons, firstButton)
    {
        // we've selected the first button
    }
}

但是我得到了

  

键入' ImplicitlyUnwrappedOptional'不符合协议等同

好的,让我们转到Objective-C并让ButtonThing实现<Equatable>。但它并没有意识到这一点。

那我该怎么办? 现在我围绕它构建,强制数组成为NSArray并使用indexOfObject。但这很难看。令人沮丧。

2 个答案:

答案 0 :(得分:8)

首先,在Swift中为您的班级编写一个自定义==运算符函数。

其次,在Swift中,编写一个类扩展,添加Equatable协议一致性。

也许,例如:

func == (lhs: YourClass, rhs: YourClass) -> Bool {
    // whatever logic necessary to determine whether they are equal
    return lhs === rhs
}

extension YourClass: Equatable {}

现在你的班级符合Equatable,这是特定于Swift的。您不能在Objective-C端执行此操作,因为您无法为Objective-C编写自定义运算符。

答案 1 :(得分:0)

如果您的Objective C类是NSObject,请实现isEqual:

- (BOOL)isEqual:(_Nullable id)other;

这适用于我的Array.index(of:myobject)和==比较。 NSObject已经是Equatable,所以使用Swift扩展不起作用。