当前位置: 首页 > 知识库问答 >
问题:

如何在swift中使用特定类型创建闭包?

吕奇
2023-03-14

我使用的是swift软件包车载套件,它需要一个我无法理解的特定闭包类型。类<code>OnboardPage</code>要求参数<code>action</code>的类型为<code>OnboardPageAction</code>。

public typealias OnboardPageCompletion = ((_ success: Bool, _ error: Error?) -> Void)
public typealias OnboardPageAction = (@escaping OnboardPageCompletion) -> Void
OnboardPage(title: "Title",
            description: "description",
            action: action)

这是我最新的尝试,我沿着这些路线尝试了几种变体。

let action: ((_ success: Bool, _ error: Error?) -> ()) = {_,_ in
    print("help")
}

XCode 失败,并显示错误消息:

无法转换类型为'(Bool,Error?) -

我到底做错了什么?错误是在我的闭包定义中还是在OnboardPage()调用中使用它的方式中?谢谢:)

(我在这里学习了有关闭包的详细信息 Closures Swift How To,但我无法定义软件包期望的正确闭包类型)

共有2个答案

慎懿轩
2023-03-14

动作的声明应该如下所示,以匹配所提供的定义:

let action: OnboardPageAction = { (_ closure: ((_ success: Bool, _ error: Error?) -> Void)) in
    print("action")
}
长孙昀
2023-03-14

从上下文判断,我猜操作参数的目的是允许您在出现OnboardPage时运行一些代码。此“操作”可能需要一些时间(当操作返回时可能无法完成),因此它提供了一个完成处理程序参数,您可以调用该参数来指示您要做的事情已经完成。

如果您只想打印Hello,您可以在打印Hello后调用参数以指示您完成了要做的事情:

OnboardPage(title: "Title",
        description: "description",
        action: { completion in
            print("Hello")
            completion(true, nil)
        })

或简称

OnboardPage(title: "Title",
        description: "description") {
            print("Hello")
            $0(true, nil)
        }

第一个参数指示操作是否成功,第二个参数包含操作失败时的可选错误。

 类似资料:
  • 问题内容: 在目标c中,我可以创建一个类数组并在方法中使用它 但是,swift没有“类”功能。返回类的元类型会导致错误 最后一行导致“致命错误:数组元素无法桥接到Objective-C” 如何在Swift中创建类数组? 问题答案: 显然,此问题已在Beta 3中修复,因此不再需要解决方法 我发现了一个纯粹的Swift hack: 先前的答案 我无法在Swift中以任何方式获取实例。似乎无法直接从转

  • 问题内容: 我一直在四处搜寻有关如何使用Swift 2.0为MapView制作MKCircle注释的良好解释,但我似乎找不到足够的解释。有人可以张贴一些示例代码来显示如何创建MKCircle批注吗?这是我用来制作地图并获取坐标的代码。 问题答案: 将展示有关如何使用xcode 8.3.3的swift 3在地图视图上创建圆形叠加层的分步方法 在您的主故事板文件中,将地图工具包视图拖到故事板的场景(视

  • 问题内容: 我一直在努力在Swift中创建UIAlertView,但由于某种原因,由于出现此错误,我无法正确执行该语句: 找不到接受提供的参数的’init’的重载 这是我的写法: 然后调用它,我正在使用: 截至目前,它崩溃了,我似乎无法正确理解语法。 问题答案: 从班级: //不推荐使用UIAlertView。改用 UIAlertController 和UIAlertControllerStyle

  • 我一直在Swift中创建一个UIAlertView,但由于某种原因,我无法得到正确的语句,因为我得到了以下错误: 找不到接受所提供参数的“init”的重载

  • 问题内容: 我想创建我现有的swift类的类别,但是IDE中没有选择这样做的选项。 知道在快速项目中是否存在类别?还是如何在Swift项目中实现类似的功能? 问题答案: 在Swift中,您可以用来向现有的类,结构和枚举类型添加新功能。 它们在一些方面与Objective-C类别有所不同,主要是: 他们没有名字 您不需要显式导入扩展。如果定义扩展以将新功能添加到现有类型,则新功能将在该类型的所有现有

  • 我需要在Swift中创建一个singleton类。谁能帮我查一下密码吗?我已经知道,单例类在创建泛型代码方面非常有用。