创建swift闭包并将其作为完成块传递给objective-c类

时间:2017-07-05 05:09:38

标签: ios objective-c swift closures

现在我在基于Objective-C的iOS应用程序上添加Swift代码。

但是我在从Swift方面调用objective-C方法时遇到了问题。

我希望在使用Swift编写的UIImageViewView中的ViewController上获取并绘制图像。 另一方面,我的照片库包装类是用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);
                                            }];
}

我可以在目标-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'

3 个答案:

答案 0 :(得分:2)

objective-c 中的阻止typedef void (^AppPhotoLibraryGetImageCompletion)(UIImage *image, NSError *error);的回复类型为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
    ...
    ...
})

答案 1 :(得分:2)

MySwiftViewController.swift 文件中completion变量的声明错误。
像这样编辑:

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)
}

答案 2 :(得分:-1)

应该是typedef而不是Typedef。在界面声明之上移动typedef,不要再声明:

typedef void (^AppPhotoLibraryGetImageCompletion)(UIImage *image, NSError *error);

@interface MyPhotoLibraryMgr....

更改后,它应该在Swift中有效,自动完成会将您的AppPhotoLibraryGetImageCompletion更改为(image, error) {..}