在Objective-C,可以定义一个块的输入和输出,商店,在一个方法中传递的那些块中的一个,然后在以后使用该块:
// in .h
typedef void (^APLCalibrationProgressHandler)(float percentComplete);
typedef void (^APLCalibrationCompletionHandler)(NSInteger measuredPower, NSError *error);
// in .m
@property (strong) APLCalibrationProgressHandler progressHandler;
@property (strong) APLCalibrationCompletionHandler completionHandler;
- (id)initWithRegion:(CLBeaconRegion *)region completionHandler:(APLCalibrationCompletionHandler)handler
{
self = [super init];
if(self)
{
...
_completionHandler = [handler copy];
..
}
return self;
}
- (void)performCalibrationWithProgressHandler:(APLCalibrationProgressHandler)handler
{
...
self.progressHandler = [handler copy];
...
dispatch_async(dispatch_get_main_queue(), ^{
_completionHandler(0, error);
});
...
}
所以我试图做equivilant斯威夫特:
var completionHandler:(Float)->Void={}
init() {
locationManager = CLLocationManager()
region = CLBeaconRegion()
timer = NSTimer()
}
convenience init(region: CLBeaconRegion, handler:((Float)->Void)) {
self.init()
locationManager.delegate = self
self.region = region
completionHandler = handler
rangedBeacons = NSMutableArray()
}
编译器不喜欢completionHandler的上述声明。 这并不是说我责备它,但是,我怎么定义可以在斯威夫特方式设置和使用后封闭?
编译器会抱怨上
var completionHandler: (Float)->Void = {}
因为右边是不恰当签名的关闭,即关闭服用float参数。 下面将分配一个“什么都不做”关闭到完成处理:
var completionHandler: (Float)->Void = {
(arg: Float) -> Void in
}
并且这可以缩短到
var completionHandler: (Float)->Void = { arg in }
由于自动类型推断。
但你可能想要的是,完成处理程序被初始化到nil
以同样的方式,一个Objective-C的实例变量inititialized到nil
。 在斯威夫特这可以通过一个可选的实现:
var completionHandler: ((Float)->Void)?
现在的属性自动初始化到nil
(“没有价值”)。 在斯威夫特你可以使用可选的结合检查完成处理的有值
if let handler = completionHandler {
handler(result)
}
或可选的链接:
completionHandler?(result)
Objective-C的
@interface PopupView : UIView
@property (nonatomic, copy) void (^onHideComplete)();
@end
@interface PopupView ()
...
- (IBAction)hideButtonDidTouch:(id sender) {
// Do something
...
// Callback
if (onHideComplete) onHideComplete ();
}
@end
PopupView * popupView = [[PopupView alloc] init]
popupView.onHideComplete = ^() {
...
}
迅速
class PopupView: UIView {
var onHideComplete: (() -> Void)?
@IBAction func hideButtonDidTouch(sender: AnyObject) {
// Do something
....
// Callback
if let callback = self.onHideComplete {
callback ()
}
}
}
var popupView = PopupView ()
popupView.onHideComplete = {
() -> Void in
...
}
我已经提供了一个例子不知道这是你追求的。
var completionHandler: (value: Float) -> ();
func printFloat(value: Float) {
println(value)
}
completionHandler = printFloat
completionHandler(value: 5)
它只是使用打印5 completionHandler
声明的变量。
在迅速4.我创建包含两个参数字典和布尔封闭变量。
var completionHandler:([String:Any], Bool)->Void = { dict, success in
if sucess {
print(dict)
}
}
调用闭包变量
self.completionHandler(["name":"Gurjinder singh"],true)
闭包可以声明为typealias
如下
typealias Completion = (Bool, Any, Error) -> Void
如果你想在你的函数代码中任何地方使用; 你可以写像正常变量
func xyz(with param1: String, completion: Completion) {
}
这工作太:
var exeBlk = {
() -> Void in
}
exeBlk = {
//do something
}
//instead of nil:
exeBlk = {}
对我来说,以下是工作:
var completionHandler:((Float)->Void)!