En Objective-C, puede definir la entrada y salida de un bloque, almacenar uno de esos bloques que se pasa a un método, luego usar ese bloque más tarde:
// 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);
});
...
}
Así que estoy tratando de hacer el equivalente en 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()
}
Al compilador no le gusta esa declaración de finalización Handler. No es que lo culpe, pero, ¿cómo defino un cierre que se puede configurar y usar más tarde en Swift?
swift
closures
objective-c-blocks
Jay Dub
fuente
fuente
Respuestas:
El compilador se queja de
porque el lado derecho no es un cierre de la firma apropiada, es decir, un cierre que toma un argumento flotante. Lo siguiente asignaría un cierre de "no hacer nada" al controlador de finalización:
y esto se puede acortar a
debido a la inferencia de tipo automática.
Pero lo que probablemente desee es que el controlador de finalización se inicialice de
nil
la misma manera en que se inicializa una variable de instancia de Objective-Cnil
. En Swift esto se puede realizar con una opción :Ahora la propiedad se inicializa automáticamente en
nil
("sin valor"). En Swift, usaría un enlace opcional para verificar si el controlador de finalización tiene un valoro encadenamiento opcional:
fuente
((Float)->Void)!
algo diferente de((Float)->Void)?
? ¿No se declara una opción no inicializada con el?
valor predeterminadonil
ya?C objetivo
Rápido
fuente
He proporcionado un ejemplo no estoy seguro de si esto es lo que buscas.
Simplemente imprime 5 usando la
completionHandler
variable declarada.fuente
En Swift 4 y 5 . Creé una variable de cierre que contiene dos parámetros de diccionario y bool.
Llamar a la variable de cierre
fuente
Los cierres se pueden declarar de la
typealias
siguiente maneraSi desea usar en su función en cualquier parte del código; puedes escribir como variable normal
fuente
Esto también funciona:
fuente
Para mí lo siguiente estaba funcionando:
fuente