Завершение обратного вызова с использованием замыканий в Swift [дубликат]

изменить последнюю версию sdk, которая была для меня работа

1. Нажмите файл, а затем щелкните структуру проекта 2. затем выберите «приложение», затем нажмите «ОК», это сработало для меня.

101
задан Forge 6 May 2017 в 07:39
поделиться

7 ответов

Компилятор жалуется на

var completionHandler: (Float)->Void = {}

, поскольку правая сторона не является замыканием соответствующей сигнатуры, т. е. замыкание, принимающее аргумент float. Следующее будет назначать замыкание «ничего не делать» обработчику завершения:

var completionHandler: (Float)->Void = {
    (arg: Float) -> Void in
}

, и это может быть сокращено до

var completionHandler: (Float)->Void = { arg in }

из-за автоматического вывода типа.

Но вы, вероятно, хотите, чтобы обработчик завершения инициализировался на nil таким же образом, что переменная экземпляра Objective-C инициализирована на nil. В Swift это может быть реализовано с помощью optional :

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

Теперь свойство автоматически инициализируется nil («no value»). В Swift вы использовали бы необязательную привязку для проверки обработчика завершения, имеет значение

if let handler = completionHandler {
    handler(result)
}

или дополнительную цепочку:

completionHandler?(result)
265
ответ дан Martin R 19 August 2018 в 20:00
поделиться
  • 1
    «В Swift это может быть реализовано с помощью неявно развернутого необязательного» Или "явно развернутый" (т. е. обычным) необязательным – newacct 5 August 2014 в 22:26
  • 2
    Использует ли ((Float)->Void)! значение, отличное от ((Float)->Void)?? Не объявляет ли uninitialized необязательный параметр с ? по умолчанию nil уже? – Suragch 1 July 2016 в 01:42

Цель-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 = ^() {
    ...
}

Swift

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 
    ...
}
27
ответ дан Forge 19 August 2018 в 20:00
поделиться
  • 1
    Но управляется ли управление памятью автоматически? Потому что в Obj-C вы указываете, что свойство должно быть «копировать», но быстрый, похоже, не имеет этого параметра и определен как «сильный». вместо этого, или делает это? – Paulius Vindzigelskis 21 November 2016 в 21:45

В swift 4. Я создал переменную закрытия, содержащую два словаря параметров и bool.

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

Вызов переменной закрытия

self.completionHandler(["name":"Gurjinder singh"],true)
3
ответ дан Gurjinder Singh Khalsa 19 August 2018 в 20:00
поделиться

Это тоже работает:

var exeBlk = {
    () -> Void in
}
exeBlk = {
    //do something
}
//instead of nil:
exeBlk = {}
1
ответ дан mark 19 August 2018 в 20:00
поделиться

Закрытия могут быть объявлены как typealias ниже

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

Если вы хотите использовать в своей функции в любом месте кода; вы можете написать как обычную переменную

func xyz(with param1: String, completion: Completion) {
}
2
ответ дан Raghav 19 August 2018 в 20:00
поделиться

Для меня работало:

var completionHandler:((Float)->Void)!
-1
ответ дан shA.t 19 August 2018 в 20:00
поделиться

Я приведу пример не уверен, что это то, что вам нужно.

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

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

completionHandler = printFloat

completionHandler(value: 5)

Он просто печатает 5, используя объявленную переменную completionHandler.

3
ответ дан TheLazyChap 19 August 2018 в 20:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: