如何让我的 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 扩展名不起作用。
我有一个 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 扩展名不起作用。