我正在将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?我已尝试过其他帖子和文档中的许多解决方案,但仍未获得正确的语法。
答案 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的转换,变量声明,函数定义和函数调用都集中在一个地方。