现在我在基于Objective-C的iOS应用程序上添加Swift代码。
但是我在从Swift方面调用objective-C方法时遇到了问题。
我希望在使用Swift编写的UIImageView
或View
中的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编写的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'
答案 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) {..}