簡體   English   中英

創建快速關閉並將其作為完成塊傳遞給Objective-C類

[英]Create swift closure and pass it to objective-c class as completion block

現在,我在基於Objective-C的iOS應用程序上添加Swift代碼。

但是從Swift方面調用Objective-C方法時遇到問題。

我想在用Swift編寫的ViewViewController 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編寫的ViewViewController獲取並繪制圖像,如下所示,

・ 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編寫的ViewViewController獲得圖像。

・ 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM