我正在尝试将此示例转换为: https://github.com/NilStack/NKWatchChart
到swift2-code。我正好遇到这个问题:
data01.getData = ^(NSUInteger index) {
CGFloat yValue = [data01Array[index] floatValue];
return [NKLineChartDataItem dataItemWithY:yValue];
};
getData定义如下:
public class NKLineChartData : NSObject {
public var color: UIColor!
public var alpha: CGFloat
public var itemCount: UInt
public var getData: LCLineChartDataGetter!
LCLineChartDataGetter是一个类型别名:
public typealias LCLineChartDataGetter = (UInt) -> NKLineChartDataItem!
我对objective-c和swift很新,所以也许有人可以指出我如何使用swift完成任务!
答案 0 :(得分:2)
我自己找到了解决方案。 Swift中的等价物是:
data01.getData = {(index : UInt) -> NKLineChartDataItem in
let yValue : CGFloat = CGFloat(data01Array[Int(index)] as! NSNumber)
return NKLineChartDataItem.init(y: yValue)
}
也许有人有更好/更短的解决方案,但上述似乎有效;)
答案 1 :(得分:1)
在Obj-C中分配给getData
的东西是一个接受整数参数并返回NKLineChartDataItem
的块。 (如果您需要帮助记住这些内容,请检查http://goshdarnblocksyntax.com之类的内容。)
在Swift中,相应closure的正式语法如下所示:
data01.getData = { (index: UInt) -> NKLineChartDataItem! in
// body
}
但你也可以使用类型推断来缩短它:
data01.getData = { index in
// body
}
查看您链接到的NKWatchChart自述文件中的更多示例:
NSArray * data01Array = @[@60.1, @160.1, @126.4, @0.0, @186.2, @127.2, @176.2];
NKLineChartData *data01 = [NKLineChartData new];
data01.color = NKGreen;
data01.alpha = 0.9f;
data01.itemCount = data01Array.count;
data01.inflexionPointStyle = NKLineChartPointStyleTriangle;
data01.getData = ^(NSUInteger index) {
CGFloat yValue = [data01Array[index] floatValue];
return [NKLineChartDataItem dataItemWithY:yValue];
};
你可以通过原生的Swift类型进一步缩短它:
let data01Array: [CGFloat] = [60.1, 160.1, 126.4, 0.0, 186.2, 127.2, 176.2]
let data01 = NKLineChartData()
data01.color = NKGreen
data01.alpha = 0.9
data01.itemCount = data01Array.count
data01.inflexionPointStyle = .Triangle;
data01.getData = { NKLineChartDataItem(y: data01Array[$0]) }
答案 2 :(得分:0)
您不需要将swift转换为objective-c以使其在您的项目中运行。只需将swift拖到项目中,Xcode就会自动生成一个桥接标题