ios - Objective-C block - 转换 Swift 不工作

标签 ios objective-c swift

我刚刚将基于 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,但闭包需要一个非可选的 UIImageinit?(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/

相关文章:

objective-c - 如何将 UISerachBar 添加到 UIToolBar?

ios - 收到的事件子类型是无法识别的选择器

ios - 我如何知道何时可以重新加载 TableView ,以便它显示我下载和解析的 JSON 数据?

swift - NSString initWithBytes 使用 swift

ios - Stripe 和 Apple Pay 无法在 iOS 应用程序中使用

iphone - MKMapView 中的缩放级别

ios - 如何在 NSMutableArray 结构下排序

ios - 仅 AssetCatalog LaunchImage Landscape - iPhone 4S/5/5S 未显示

iphone - 在 IOS 5 中从 UIImagePickerController 保存视频

ios - OpenGL ES - 两种颜色的最有效纹理格式 : white and fully transparent