如何使我的Objective-C类符合Swift';s'Equalable'协议?
我有一个Objective-C类(恰好是一个按钮,但这并不重要),在我(混合语言)项目的另一部分,我有一个这些按钮的数组,我想使用如何使我的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) {
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
没有这样注释,这样注释是没有意义的。