Di Objective-C, Anda bisa menentukan input dan output blok, simpan salah satu blok yang diteruskan ke metode, lalu gunakan blok itu nanti:
// 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);
});
...
}
Jadi saya mencoba melakukan equivilant di 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()
}
Kompiler tidak suka pernyataan penyelesaian Handler. Bukannya saya menyalahkannya, tetapi, bagaimana saya mendefinisikan penutupan yang dapat diatur dan digunakan nanti di Swift?
swift
closures
objective-c-blocks
Jay Dub
sumber
sumber
Jawaban:
Kompiler mengeluh
karena sisi kanan bukanlah penutupan dari tanda tangan yang sesuai, yaitu penutupan yang mengambil argumen float. Yang berikut ini akan memberikan penutupan "jangan lakukan apa pun" pada penangan penyelesaian:
dan ini dapat disingkat menjadi
karena inferensi tipe otomatis.
Tapi apa yang Anda inginkan adalah bahwa handler penyelesaian diinisialisasi dengan
nil
cara yang sama bahwa variabel instance Objective-C diinisialisasi kenil
. Dalam Swift ini dapat diwujudkan dengan opsional :Sekarang properti secara otomatis diinisialisasi ke
nil
("tidak ada nilai"). Di Swift Anda akan menggunakan penjilidan opsional untuk memeriksa penangan penyelesaian memiliki nilaiatau rantai opsional:
sumber
((Float)->Void)!
berbeda dari((Float)->Void)?
? Bukankah mendeklarasikan opsional yang belum diinisialisasi dengan?
standarnil
sudah?Objektif-C
Cepat
sumber
Saya telah memberikan contoh yang tidak yakin apakah ini yang Anda cari.
Ini hanya mencetak 5 menggunakan
completionHandler
variabel yang dideklarasikan.sumber
Dalam Swift 4 dan 5 . Saya membuat variabel penutupan yang berisi dua kamus parameter dan bool.
Memanggil variabel penutupan
sumber
Penutupan dapat dinyatakan
typealias
sebagai berikutJika Anda ingin menggunakan fungsi Anda di mana saja dalam kode; Anda dapat menulis seperti variabel normal
sumber
Ini juga berfungsi:
sumber
Bagi saya berikut ini berfungsi:
sumber