Objective-C阻止Swift Closure翻译Estimote“examples”app

时间:2015-06-20 04:42:48

标签: swift closures block

我正在将Estimote“Examples”iOS应用程序从Objective-C翻译为Swift,并且遇到了翻译以下内容的问题:

@property (nonatomic, copy)     void (^completion)(CLBeacon *);

- (id)initWithScanType:(ESTScanType)scanType completion:(void (^)(id))completion
{
    self = [super init];
    if (self)
    {
        self.scanType = scanType;
        self.completion = [completion copy];
    }
    return self;
}

demoViewController = [[ESTBeaconTableVC alloc] initWithScanType:ESTScanTypeBeacon
                                                 completion:^(CLBeacon *beacon) {

  ESTDistanceDemoVC *distanceDemoVC = [[ESTDistanceDemoVC alloc] initWithBeacon:beacon];
  [self.navigationController pushViewController:distanceDemoVC animated:YES];
}];

如何将其转换为Swift?我已尝试过其他帖子和文档中的许多解决方案,但仍未获得正确的语法。

2 个答案:

答案 0 :(得分:0)

首先,初始化程序称为init;他们没有func。要调用超类初始值设定项,您需要super.init(),而无需检查nil的返回值。此外,应在调用超类初始化程序之前初始化类的属性:

init(scanType: ESTScanType completion: (CLBeacon? -> Void)?) {
    self.scanType = scanType
    self.completion = completion
    super.init()
}

然后,您创建一个对象并通过调用该类的名称来调用初始化程序。如果调用的最后一个参数是函数类型,则可以使用尾随闭包表达式。你应该使用可选的链接而不是强制一个可选的,以保持与Objective-C相同的行为,它在nil上调用时不会崩溃。

demoViewController = ESTBeaconTableVC(scanType:ESTScanTypeBeacon) { beacon in
  let distanceDemoVC = ESTDistanceDemoVC(beacon:beacon)
  self.navigationController?.pushViewController(distanceDemoVC animated:true)
}

答案 1 :(得分:-1)

经过多次试验和错误(不是我喜欢编码的方式),这段代码似乎有效:

var completion: ((value: CLBeacon?) -> Void)?

func initWithScanType(scanType: ESTScanType,
                    completion: ((AnyObject?) -> Void)) -> UIViewController
{
    if let _:ESTBeaconTableVC = ESTBeaconTableVC()
    {
        self.scanType = scanType
        self.completion = completion
    }
    return self
}

demoViewController = ESTBeaconTableVC().initWithScanType(
                        ESTBeaconTableVC.ESTScanType.ESTScanTypeBeacon,
                                                           completion:{ beacon in

    let distanceDemoVC = ESTDistanceDemoVC().initWithBeacon(beacon as! CLBeacon)
    self.navigationController!.pushViewController(distanceDemoVC!, animated:true)
})

我没有找到一个很好的参考资料,用一个连贯的例子解释了从Obj-C到Swift的转换,变量声明,函数定义和函数调用都集中在一个地方。