Objective C / Swift转换:如何在swift中执行此操作?

时间:2015-11-29 20:47:33

标签: objective-c swift

我正在尝试将此示例转换为: 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完成任务!

3 个答案:

答案 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就会自动生成一个桥接标题