如何快速创建具有特定类型别名的闭包?

时间:2019-10-19 12:04:45

标签: ios swift closures

我使用的是swift软件包OnboardKit,它需要我无法弄清的特定封闭类型。 类OnboardPage要求参数OnboardPageAction的类型为action

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?)-> Void'类型的值转换为预期值   参数类型“ OnboardPageAction?” (aka'Optional <(@@ escaping(Bool,   可选)->())->()>')

我在这里做错了什么?是关闭定义中的错误,还是在OnboardPage()调用中使用错误的方式?谢谢:)

(我在Closures Swift How To处了解了有关闭包的详细信息,但我无法定义程序包期望的正确的闭包类型)

2 个答案:

答案 0 :(得分:1)

从上下文来看,我猜想A参数的目的是允许您在显示action时运行一些代码。此“操作”可能要花一些时间(返回OnboardPage时可能不会完成),因此它为您提供了一个完成处理程序参数,您可以调用该参数来指示您想要完成的操作。

如果只想打印Hello,则可以在打印hello之后调用该参数,以表明您已完成想要做的事情:

action

或者简单地

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

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

答案 1 :(得分:1)

动作声明应类似于提供的定义:

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