无法在 Swift 中调用 Objective-C 方法

Cannot invoke an Objective-C method in Swift

我正在尝试重写 Swift 中的 Objective-C 代码示例。代码基本上是使用CorePlot画图,写在Objective-C中(样本来自here)。这是一段原始的 Objective-C 代码:

CPTMutablePlotRange *xRange = [plotSpace.xRange mutableCopy];
[xRange expandRangeByFactor:CPTDecimalFromCGFloat(1.1f)];

我这样重写:

var xRange = plotSpace.plotRangeForCoordinate(CPTCoordinate.X).mutableCopy() as CPTMutablePlotRange;
xRange.expandRangeByFactor(NSDecimalNumber(1.1))

在这一点上我有一个编译错误说“CPTMutablePlotRage does not have a member named 'expandRangeByFactor'”。有人知道我做错了什么吗?我检查了 Objective-C 代码,CTMutablePotRange 肯定有一个方法叫做 expandRangeByFactor. 谢谢。

expandRangeByFactor 存在,但它需要一个 NSDecimal。您正在尝试提供一个 NSDecimalNumber,这不是一回事。 (您的代码的另一个问题 - 在这种情况下无关紧要,但仍然是一个问题 - 是您不能说 NSDecimalNumber(1.1)。没有这样的初始化程序。)

这里需要传递一个NSDecimal参数。这就是为什么原始 Objective-C 代码调用 Core Plot 函数 CPTDecimalFromCGFloat() - 以生成此处的 NSDecimal。

但是,您不能在 Swift 中这样做,因为它不知道 NSDecimal。因此,无论您做什么,Swift 都看不到此方法,因为它看不到采用其无法处理的类型的值的方法。

Core Plot 的人都知道这个问题:请参阅 https://github.com/core-plot/core-plot/issues/96 The new release-2.0 branch contains a fix. As you can see here,在新的 API 中,您可以将 NSNumber 传递给 expandRangeByFactor

更新:Swift 1.2(在Xcode 6.3 及更高版本中可用)可以处理 NSDecimal。