在 Swift class 中声明的运算符重载“<”在 Objective-C 中使用时有时不会被调用
Operator overload "<" declared in Swift class is sometimes not called when used in Objective-C
我遇到了一个与 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
}
然后在 Objective-C 方法中使用它,如下所示:
if (distance < averageDistance){
// code
}
当调用 Objective-C 方法时,我可以在 <
方法中添加一个 print()
语句和断点,以确认何时使用运算符重载。在一种情况下,它神秘地跳过了 Swift 中定义的运算符重载,并在两个 GKDistance 对象之间使用常规 Objective-C 比较器。
当 运行 与 distance.value == 2375.1842554877021
和 averageDistance.value == 75.671794891357421
、distance < averageDistance
returns true
时,Swift 运算符重载永远不会命中,Objective-C 执行条件内的代码。
如果我将有问题的 Objective-C 方法转换为 Swift,它的行为符合预期,但我担心在我们的各种 Objective-C 方法中还有其他 GKDistance 比较可能无法看到 Swift 运算符重载的应用程序。
有没有人 运行 遇到与 Swift/Objective-C 互操作性有关的与运算符重载相关的类似问题?
你的
public func <(a:GKDistance, b:GKDistance) -> Bool { }
is – 像所有 Swift 运算符一样 –
一个顶级函数,和顶级函数
未导出到 Objective-C,请参阅 "Swift Type Compatibility"
在 "Interacting with Objective-C APIs".
另请注意,您 不能 覆盖 (Objective-)C 中的运算符(如 <
),请参见
- Operator overloading in C
- Is it possible to overload operators in C?
因此在
if (distance < averageDistance) {
// code
}
只是比较了两个指针,条件为真如果
distance
指向的对象驻留在较低的内存地址
比 averageDistance
指向的对象指针(这显然是
不是你想要的)。
你可以做的是在你的 class 中实现一个 compare:
方法,
类似于 NSString
或 NSNumber
.
另请注意,对于 NSObject
subclasses,您应该覆盖
isEqual:
而不是实施 ==
,比较
我遇到了一个与 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
}
然后在 Objective-C 方法中使用它,如下所示:
if (distance < averageDistance){
// code
}
当调用 Objective-C 方法时,我可以在 <
方法中添加一个 print()
语句和断点,以确认何时使用运算符重载。在一种情况下,它神秘地跳过了 Swift 中定义的运算符重载,并在两个 GKDistance 对象之间使用常规 Objective-C 比较器。
当 运行 与 distance.value == 2375.1842554877021
和 averageDistance.value == 75.671794891357421
、distance < averageDistance
returns true
时,Swift 运算符重载永远不会命中,Objective-C 执行条件内的代码。
如果我将有问题的 Objective-C 方法转换为 Swift,它的行为符合预期,但我担心在我们的各种 Objective-C 方法中还有其他 GKDistance 比较可能无法看到 Swift 运算符重载的应用程序。
有没有人 运行 遇到与 Swift/Objective-C 互操作性有关的与运算符重载相关的类似问题?
你的
public func <(a:GKDistance, b:GKDistance) -> Bool { }
is – 像所有 Swift 运算符一样 – 一个顶级函数,和顶级函数 未导出到 Objective-C,请参阅 "Swift Type Compatibility" 在 "Interacting with Objective-C APIs".
另请注意,您 不能 覆盖 (Objective-)C 中的运算符(如 <
),请参见
- Operator overloading in C
- Is it possible to overload operators in C?
因此在
if (distance < averageDistance) {
// code
}
只是比较了两个指针,条件为真如果
distance
指向的对象驻留在较低的内存地址
比 averageDistance
指向的对象指针(这显然是
不是你想要的)。
你可以做的是在你的 class 中实现一个 compare:
方法,
类似于 NSString
或 NSNumber
.
另请注意,对于 NSObject
subclasses,您应该覆盖
isEqual:
而不是实施 ==
,比较