小编hel*_*hum的帖子

在Objective-C中使用时,有时不会调用在Swift类中声明的运算符重载"<"

我遇到了一个与Swift/Objective-C互操作性相关的奇怪问题.案例是这样的:

我有一个@objc public class GKDistance:NSObject,NSCoding,Comparable用Swift写的.为了比较距离,我添加了一个运算符重载,<如下所示:

public func <(a:GKDistance, b:GKDistance) -> Bool {
    return a.value < b.value
}

public func ==(a:GKDistance, b:GKDistance) -> Bool {
    return a.value == b.value
}
Run Code Online (Sandbox Code Playgroud)

然后将它用于Objective-C方法,如下所示:

if (distance < averageDistance){
    // code
}
Run Code Online (Sandbox Code Playgroud)

调用Objective-C方法时,我可以print()<方法中添加语句和断点,以确认何时使用运算符重载.在一种情况下,它神秘地跳过Swift中定义的运算符重载,并使用两个GKDistance对象之间的常规Objective-C比较器.

当使用distance.value == 2375.1842554877021and 运行时averageDistance.value == 75.671794891357421,distance < averageDistance返回时true,Swift运算符重载永远不会被命中,而Objective-C执行条件内的代码.

如果我将有问题的Objective-C方法转换为Swift,它的行为与预期一致,但我担心在我们的应用程序中各种Objective-C方法中存在其他GKDistance比较,可能无法看到Swift运算符重载.

有没有人遇到与Swift/Objective-C互操作性类似的问题,因为它与运营商重载有关?

operator-overloading objective-c language-interoperability swift

6
推荐指数
1
解决办法
335
查看次数