我刚刚将基于 Objective-C 的照片库集成到我的代码中,但当我尝试将 Objective-C 示例代码重写到 Swift 中时,特别是在一个地方。这是导致问题的 Objective-C 代码。
__weak MHGalleryController *blockGallery = gallery;
gallery.finishedCallback = ^(NSInteger currentIndex,UIImage *image,MHTransitionDismissMHGallery *interactiveTransition,MHGalleryViewMode viewMode){
NSIndexPath *newIndex = [NSIndexPath indexPathForRow:currentIndex inSection:0];
[self.tableView scrollToRowAtIndexPath:newIndex atScrollPosition:UITableViewScrollPositionMiddle animated:NO];
dispatch_async(dispatch_get_main_queue(), ^{
UIImageView *imageView = [(ImageTableViewCell*)[self.tableView cellForRowAtIndexPath:newIndex] iv];
[blockGallery dismissViewControllerAnimated:YES dismissImageView:imageView completion:nil];
});
};
我的假设是我需要将 finishedCallback 变量设置为带参数的闭包 - 类似于上面的 block 。因此我尝试做同样的事情。我的 block 在下面被引用为变量“closingBlockInputs”。
weak var blockedGallery = gallery
var closingBlock = {
(currentIndex:NSInteger, image:UIImage, interactiveTransition: MHTransitionDismissMHGallery, viewMode: MHGalleryViewMode) -> () in
}
var tr = MHTransitionDismissMHGallery()
gallery.finishedCallback = closingBlock(1, UIImage(name:"temp"),tr,MHGalleryViewMode.OverView)
但是,当我运行代码时,出现如下错误:
() is not convertible to Int, UIImage, MHTransitionDismissMHGallery, MHGalleryViewMode
我很确定我的一般流程是正确的,只是遗漏了一些东西......
任何帮助将不胜感激......
最佳答案
finishedCallback
的类型为 (NSInteger, UIImage, MHTransitionDismissMHGallery, MHGalleryViewMode) -> ()
,即一个接受四个输入参数并返回 的闭包>无效
。在您的 Swift 代码中,您正在调用 closingBlock
并尝试将其返回 值 (Void
) 分配给 finishedCallback
,这就是错误告诉您 ()
(又名 Void
)无法转换为闭包类型的原因。
还有一些值得注意的事情。 UIImage(name: "temp")
返回一个可选的 UIImage
,但闭包需要一个非可选的 UIImage
。 init?(name:)
初始化程序是可失败的,因为可能没有具有指定名称的图像文件。因此,请确保在将可选的 UIImage
作为参数传递给闭包之前对其进行解包。
接下来要考虑的是闭包参数的类型由编译器推断,因此无需显式编写。
此外,Swift 使用捕获列表解决闭包中的强引用循环,而不是通过声明变量的单独 weak
版本(有关此机制的详细信息,请参阅 The Swift Programming Language 中的 Strong Reference Cycles for Closures) .
所以我希望您的代码在 Swift 中看起来像这样:
gallery.finishedCallback = { [unowned gallery] currentIndex, image, interactiveTransition, viewMode in
// ...
}
关于ios - Objective-C block - 转换 Swift 不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29321740/