6

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

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

但我得到了

类型 'ImplicitlyUnwrappedOptional' 不符合协议 equatable

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

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

4

2 回答 2

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 {}

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

于 2015-06-19T02:37:28.713 回答
2

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

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

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

于 2017-12-21T02:19:09.273 回答