[英]Create swift closure and pass it to objective-c class as completion block
現在,我在基於Objective-C的iOS應用程序上添加Swift代碼。
但是從Swift方面調用Objective-C方法時遇到問題。
我想在用Swift編寫的View
或ViewController
UIImageView
上獲取和繪制圖像。 另一方面,我的照片庫包裝器類是用Objective-C編寫的。
我的照片庫包裝器類如下。
・ MyPhotoLibraryMgr.h
typedef void (^AppPhotoLibraryGetImageCompletion)(UIImage *image, NSError *error);
- (void)getImageWithTarget:(NSInteger)index
targetSize:(CGSize)targetSize
completion:(AppPhotoLibraryGetImageCompletion)completion;
・ MyPhotoLibraryMgr.m
- (void)getImageWithTarget:(NSInteger)index
targetSize:(CGSize)targetSize
completion:
(AppPhotoLibraryGetImageCompletion)completion
{
PHAsset *asset = _myAsetsList[index];
PHImageRequestOptions *options = [[PHImageRequestOptions alloc] init];
options.resizeMode = PHImageRequestOptionsResizeModeFast;
options.deliveryMode = PHImageRequestOptionsDeliveryModeOpportunistic;
[[PHImageManager defaultManager] requestImageForAsset:asset
targetSize:targetSize
contentMode:PHImageContentModeAspectFill
options:options
resultHandler:^(UIImage *result, NSDictionary *info) {
NSError *error = [info objectForKey:PHImageErrorKey];
if (error) {
NSLog(@"error=%@", error);
}
completion(result, error);
}];
}
我可以在由Objective-C編寫的View
或ViewController
獲取並繪制圖像,如下所示,
・ MyViewController.m
AppPhotoLibraryMgr *photoLibMgr = [AppPhotoLibraryMgr sharedInstance];
AppPhotoLibraryGetImageCompletion completion = ^(UIImage *image, NSError *error) {
imageView.image = image;
};
[[AppPhotoLibraryMgr sharedInstance] getImageWithTarget:index
targetSize:imageView.frame.size
completion:completion];
但是我無法在用Swift編寫的View
或ViewController
獲得圖像。
・ MySwiftViewController.swift
let completion = {(image: UIImage, error: NSError) -> AppPhotoLibraryGetImageCompletion in
let imageView = UIImageView(image: image)
}
photoLibMgr?.getImageWithTarget(index, targetSize: size, completion: completion)
來自Xcode的錯誤消息是
無法將類型'UIImage,NSError-> AppPhotoLibraryGetImageCompletion'的值轉換為預期的參數類型'AppPhotoLibraryGetImageCompletion'
塊typedef void (^AppPhotoLibraryGetImageCompletion)(UIImage *image, NSError *error);
在Objective-C中,返回類型為void
。
但是Swift中的計數器部分具有Void
以外的返回類型。 完成塊應類似於:
let completion = {(image: UIImage, error: NSError) -> Void in
...
...
}
使用typealias
使封閉可重用。
例:
typealias AppPhotoLibraryGetImageCompletion = (UIImage, NSError) -> Void
let completion: AppPhotoLibraryGetImageCompletion = { (image, error) in
...
...
}
編輯:不同的方式
photoLibMgr?.getImageWithTarget(index, targetSize: size, completion: { (image, error) in
...
...
})
您的completion
聲明變量在MySwiftViewController.swift文件中是錯誤的。
像這樣編輯它:
let completion: AppPhotoLibraryGetImageCompletion = { (image, error) in
let imageView = UIImageView(image: image)
}
要么
如果您不想將完成處理程序聲明為變量,則只需執行以下操作:
LinphoneLoginController.shared().getImageWithTarget(index, targetSize: size) { (image, error) in
let imageView = UIImageView(image: image)
}
它應該是typedef
而不是Typedef
。 將typedef
移動到接口聲明的頂部,然后不再聲明:
typedef void (^AppPhotoLibraryGetImageCompletion)(UIImage *image, NSError *error);
@interface MyPhotoLibraryMgr....
更改后,它應在Swift
類似地工作,自動完成將把您的AppPhotoLibraryGetImageCompletion
更改為(image, error) {..}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.