изменить последнюю версию sdk, которая была для меня работа
1. Нажмите файл, а затем щелкните структуру проекта 2. затем выберите «приложение», затем нажмите «ОК», это сработало для меня.
Компилятор жалуется на
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)
Цель-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
...
}
В swift 4. Я создал переменную закрытия, содержащую два словаря параметров и bool.
var completionHandler:([String:Any], Bool)->Void = { dict, success in
if sucess {
print(dict)
}
}
Вызов переменной закрытия
self.completionHandler(["name":"Gurjinder singh"],true)
Это тоже работает:
var exeBlk = {
() -> Void in
}
exeBlk = {
//do something
}
//instead of nil:
exeBlk = {}
Закрытия могут быть объявлены как typealias
ниже
typealias Completion = (Bool, Any, Error) -> Void
Если вы хотите использовать в своей функции в любом месте кода; вы можете написать как обычную переменную
func xyz(with param1: String, completion: Completion) {
}
Для меня работало:
var completionHandler:((Float)->Void)!
Я приведу пример не уверен, что это то, что вам нужно.
var completionHandler: (value: Float) -> ();
func printFloat(value: Float) {
println(value)
}
completionHandler = printFloat
completionHandler(value: 5)
Он просто печатает 5, используя объявленную переменную completionHandler
.
((Float)->Void)!
значение, отличное от((Float)->Void)?
? Не объявляет ли uninitialized необязательный параметр с?
по умолчаниюnil
уже? – Suragch 1 July 2016 в 01:42