gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 10:24:39 27 4
gpt4 key购买 nike

我刚刚将基于 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com