如何让我的 Objective-C class 符合 Swift 的 `Equatable` 协议?

How can I make my Objective-C class conform to Swift's `Equatable` protocol?

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

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

但我得到了

Type 'ImplicitlyUnwrappedOptional' does not conform to protocol equatable

好的,让我们转到 Objective-C 并让 ButtonThing 实现 <Equatable>。但它不承认这一点。

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

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

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

也许,例如:

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

extension YourClass: Equatable {}

现在您的 class 符合 Equatable,这是 Swift 特定的。您不能在 Objective-C 端执行此操作,因为您无法为 Objective-C.

编写自定义运算符

如果你的 Objective C class 是一个 NSObject,实现 isEqual:

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

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