如何使我的Objective-C类符合Swift';s'Equalable'协议?

如何使我的Objective-C类符合Swift';s'Equalable'协议?,objective-c,swift,protocols,language-interoperability,Objective C,Swift,Protocols,Language Interoperability,我有一个Objective-C类(恰好是一个按钮,但这并不重要),在我(混合语言)项目的另一部分,我有一个这些按钮的数组,我想使用find()方法获取按钮的索引。像这样: func doSomethingWithThisButtonIndex(index:Int) { let buttons = [firstButton, secondButton, thirdButton] if index == find(buttons, firstButton) {

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

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

类型“隐式WrappedOptional”不符合协议equatable

好的,让我们转到Objective-C,并使用按钮工具
。但它没有意识到这一点

那我该怎么办?
目前,我正在围绕它进行构建,强制该数组成为一个NSArray,并使用
indexOfObject
。但这很难看。而且令人沮丧

首先,在Swift中为类编写一个自定义的
=
操作符函数

其次,同样在Swift中,编写一个类扩展,添加
equalable
协议一致性

例如,也许:

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

extension YourClass: Equatable {}

现在,您的类符合Swift特有的
equalable
。您不能在Objective-C端执行此操作,因为您不能为Objective-C编写自定义运算符。

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

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

对于Array.index(of:myobject)和==比较,这对我来说是有效的。NSObject已经是可平衡的,因此使用Swift扩展不起作用。

@Yerk阅读答案的最后一行。您无法对Objective-C执行此操作。Swift的
equalable
协议需要一个自定义运算符(特别是,
=
),而Objective-C无法执行此操作。也许更重要的是,您应该尝试对Objective-C执行此操作。Objective-C的
==
相当于Swift的
==
用于对象引用。我们不想改变30年前的Objective-C行为……此外,
equalable
协议没有定义为
@objc
协议,因此该协议根本不能从Objective-C使用
Equalable
是一种纯粹的Swift协议。使Objective-C类符合此协议的方法是从Swift中扩展该类。其他的一切都没有意义。您实际上是在问“如何覆盖Objective-C中
==
的默认行为?”@Alix否。Swift的
==
大致相当于Objective-C的
=
。这是一个参考比较。因此,在objective-C中,如果我想测试两个对象之间的相等性,我应该如何做?@Honey
[obj1 isEqual:obj2]。一些类,比如
NSString
,也有其他方法,比如
[str1 IsequalString:str2]。在这种特定情况下,
IsequalString:
isEqual:
是等效的。所有对象都从
NSObject
继承
isEqual:
,但默认实现只是
==
参考比较。如果我的答案不能让您满意,那么唯一的其他答案是“不可能”除非协议被注释为
@objc
,或者从Swift端执行,否则无法使Objective-C类符合Swift协议
Equatable
没有这样注释,这样注释是没有意义的。