In Objective-C können Sie die Ein- und Ausgabe eines Blocks definieren, einen der Blöcke speichern, die an eine Methode übergeben wurden, und diesen Block später verwenden:
// 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);
});
...
}
Also versuche ich, in Swift das Gleiche zu tun:
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()
}
Der Compiler mag diese Completion-DeklarationHandler nicht. Nicht dass ich es beschuldige, aber wie definiere ich einen Abschluss, der später in Swift festgelegt und verwendet werden kann?
swift
closures
objective-c-blocks
Jay Dub
quelle
quelle
Antworten:
Der Compiler beschwert sich weiter
weil die rechte Seite kein Abschluss der entsprechenden Signatur ist, dh ein Abschluss, der ein Float-Argument enthält. Das Folgende würde dem Abschluss-Handler einen Abschluss "Nichts tun" zuweisen:
und dies kann verkürzt werden auf
aufgrund der automatischen Typinferenz.
Aber was wollen Sie wahrscheinlich ist , dass der Abschluss - Handler initialisiert wird
nil
auf die gleiche Art und Weise , dass eine Objective-C Instanzvariable ist inititialized zunil
. In Swift kann dies mit einem optionalen realisiert werden :Jetzt wird die Eigenschaft automatisch auf
nil
("kein Wert") initialisiert . In Swift würden Sie die optionale Bindung verwenden, um zu überprüfen, ob der Completion-Handler einen Wert hatoder optionale Verkettung:
quelle
((Float)->Void)!
anders als((Float)->Void)?
? Wird eine nicht initialisierte Option nicht?
standardmäßig mitnil
bereits deklariert ?Ziel c
Schnell
quelle
Ich habe ein Beispiel angegeben, bei dem ich nicht sicher bin, ob Sie danach suchen.
Es wird einfach 5 mit der
completionHandler
deklarierten Variablen gedruckt .quelle
In Swift 4 und 5 . Ich habe eine Abschlussvariable erstellt, die zwei Parameter Dictionary und Bool enthält.
Aufruf der Abschlussvariablen
quelle
Schließungen können wie folgt deklariert
typealias
werdenWenn Sie in Ihrer Funktion irgendwo im Code verwenden möchten; Sie können wie eine normale Variable schreiben
quelle
Das funktioniert auch:
quelle
Für mich hat folgendes funktioniert:
quelle