我遇到了一个与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