No Objective-C, você pode definir a entrada e a saída de um bloco, armazenar um desses blocos que são passados para um método e usá-lo posteriormente:
// 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);
});
...
}
Então, eu estou tentando fazer o equivalente em 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()
}
O compilador não gosta dessa declaração de conclusãoHandler. Não que eu seja o culpado, mas como definir um fechamento que pode ser definido e usado posteriormente no Swift?
swift
closures
objective-c-blocks
Jay Dub
fonte
fonte
Respostas:
O compilador reclama
porque o lado direito não é um fechamento da assinatura apropriada, ou seja, um fechamento com argumento de flutuação. O seguinte atribuiria um encerramento "não fazer nada" ao manipulador de conclusão:
e isso pode ser reduzido para
devido à inferência automática de tipo.
Mas o que você provavelmente deseja é que o manipulador de conclusão seja inicializado
nil
da mesma maneira que uma variável de instância Objective-C é inicializadanil
. No Swift, isso pode ser realizado com um opcional :Agora a propriedade é inicializada automaticamente para
nil
("sem valor"). No Swift, você usaria a ligação opcional para verificar se o manipulador de conclusão possui um valorou encadeamento opcional:
fonte
((Float)->Void)!
diferente de((Float)->Void)?
? A declaração de um opcional não inicializado com o?
padrãonil
já é?Objetivo-C
Rápido
fonte
Forneci um exemplo, não tenho certeza se é isso que você procura.
Simplesmente imprime 5 usando a
completionHandler
variável declarada.fonte
Nos Swift 4 e 5 . Eu criei uma variável de fechamento contendo dois dicionário de parâmetros e bool.
Chamando a variável de fechamento
fonte
Os fechamentos podem ser declarados
typealias
como abaixoSe você deseja usar em sua função em qualquer lugar no código; você pode escrever como variável normal
fonte
Isso também funciona:
fonte
Para mim, o seguinte estava funcionando:
fonte