【发布时间】:2016-06-07 14:28:19
【问题描述】:
我遇到了一个与 Swift/Objective-C 互操作性相关的奇怪问题。情况是这样的:
我有一个用 Swift 编写的 @objc public class GKDistance:NSObject,NSCoding,Comparable。为了比较距离,我为< 添加了一个运算符重载,如下所示:
public func <(a:GKDistance, b:GKDistance) -> Bool {
return a.value < b.value
}
public func ==(a:GKDistance, b:GKDistance) -> Bool {
return a.value == b.value
}
然后在 Objective-C 方法中使用,如下所示:
if (distance < averageDistance){
// code
}
当调用 Objective-C 方法时,我可以在 < 方法中添加 print() 语句和断点,以确认何时使用运算符重载。在一种情况下,它神秘地跳过了 Swift 中定义的运算符重载,并在两个 GKDistance 对象之间使用了常规的 Objective-C 比较器。
当使用distance.value == 2375.1842554877021 和averageDistance.value == 75.671794891357421 运行时,distance < averageDistance 返回true,不会遇到 Swift 运算符重载,并且 Objective-C 会执行条件内的代码。
如果我将相关的 Objective-C 方法转换为 Swift,它会按预期运行,但我担心在我们的应用程序中的各种 Objective-C 方法中还有其他 GKDistance 比较可能无法看到 Swift 运算符超载。
有没有人遇到过与运算符重载有关的 Swift/Objective-C 互操作性的类似问题?
【问题讨论】:
标签: objective-c swift operator-overloading language-interoperability