我有一个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
。但这很难看。令人沮丧。
答案 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扩展不起作用。