存储封闭在斯威夫特变量存储封闭在斯威夫特变量(Store a closure as a variab

2019-05-13 04:24发布

在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的上述声明。 这并不是说我责备它,但是,我怎么定义可以在斯威夫特方式设置和使用后封闭?

Answer 1:

编译器会抱怨上

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)


Answer 2:

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 
    ...
}


Answer 3:

我已经提供了一个例子不知道这是你追求的。

var completionHandler: (value: Float) -> ();

func printFloat(value: Float) {
    println(value)
}

completionHandler = printFloat

completionHandler(value: 5)

它只是使用打印5 completionHandler声明的变量。



Answer 4:

在迅速4.我创建包含两个参数字典和布尔封闭变量。

var completionHandler:([String:Any], Bool)->Void = { dict, success  in
    if sucess {
        print(dict)
    }
}

调用闭包变量

self.completionHandler(["name":"Gurjinder singh"],true)


Answer 5:

闭包可以声明为typealias如下

typealias Completion = (Bool, Any, Error) -> Void

如果你想在你的函数代码中任何地方使用; 你可以写像正常变量

func xyz(with param1: String, completion: Completion) {
}


Answer 6:

这工作太:

var exeBlk = {
    () -> Void in
}
exeBlk = {
    //do something
}
//instead of nil:
exeBlk = {}


Answer 7:

对我来说,以下是工作:

var completionHandler:((Float)->Void)!


文章来源: Store a closure as a variable in Swift