Jay*_*Dub 132 closures objective-c-blocks swift
在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);
});
...
}
Run Code Online (Sandbox Code Playgroud)
所以我试图在Swift中做等效的事情:
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()
}
Run Code Online (Sandbox Code Playgroud)
编译器不喜欢completionHandler的声明.不是我责怪它,但是,我如何定义一个可以在Swift中设置和使用的闭包?
Mar*_*n R 319
编译器抱怨
var completionHandler: (Float)->Void = {}
Run Code Online (Sandbox Code Playgroud)
因为右边不是适当签名的闭包,即一个带浮动参数的闭包.以下将为完成处理程序分配"不执行任何操作"闭包:
var completionHandler: (Float)->Void = {
(arg: Float) -> Void in
}
Run Code Online (Sandbox Code Playgroud)
这可以缩短为
var completionHandler: (Float)->Void = { arg in }
Run Code Online (Sandbox Code Playgroud)
由于自动类型推断.
但是你可能想要的是,完成处理程序的初始化nil
方式与Objective-C实例变量初始化的方式相同nil.在斯威夫特这可以用一个可实现可选:
var completionHandler: ((Float)->Void)?
Run Code Online (Sandbox Code Playgroud)
现在该属性自动初始化为nil("无值").在Swift中,您将使用可选绑定来检查完成处理程序是否具有值
if let handler = completionHandler {
handler(result)
}
Run Code Online (Sandbox Code Playgroud)
或可选链接:
completionHandler?(result)
Run Code Online (Sandbox Code Playgroud)
小智 38
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 = ^() {
...
}
Run Code Online (Sandbox Code Playgroud)
迅速
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
...
}
Run Code Online (Sandbox Code Playgroud)
我提供了一个例子,不确定这是不是你想要的.
var completionHandler: (_ value: Float) -> ()
func printFloat(value: Float) {
print(value)
}
completionHandler = printFloat
completionHandler(5)
Run Code Online (Sandbox Code Playgroud)
它只使用completionHandler声明的变量打印5 .
在Swift 4和5中。我创建了一个包含两个参数字典和布尔值的闭包变量。
var completionHandler:([String:Any], Bool)->Void = { dict, success in
if success {
print(dict)
}
}
Run Code Online (Sandbox Code Playgroud)
调用闭包变量
self.completionHandler(["name":"Gurjinder singh"],true)
Run Code Online (Sandbox Code Playgroud)
小智 5
闭包可以声明为typealias如下
typealias Completion = (Bool, Any, Error) -> Void
Run Code Online (Sandbox Code Playgroud)
如果您想在函数中的任何地方使用代码;你可以像普通变量一样写
func xyz(with param1: String, completion: Completion) {
}
Run Code Online (Sandbox Code Playgroud)