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

Posted

技术标签:

【中文标题】如何快速创建具有特定类型别名的闭包?【英文标题】:How to create closure with specific typealias in swift? 【发布时间】:2019-10-19 12:04:45 【问题描述】:

我正在使用 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 '可选 ()) -> ()>')

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

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

【问题讨论】:

【参考方案1】:

从上下文来看,我猜action 参数的目的是让您在出现OnboardPage 时运行一些代码。这个“动作”可能需要一些时间(当action 返回时它可能不会完成),因此它为您提供了一个完成处理程序参数,您可以调用该参数来指示您想要做的事情已经完成。

如果你只是想打印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)
        

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

【讨论】:

aaaah 这比我尝试的更有意义!非常感谢【参考方案2】:

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

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

【讨论】:

以上是关于如何快速创建具有特定类型别名的闭包?的主要内容,如果未能解决你的问题,请参考以下文章

零基础快速掌握JavaScript函数简介及创建方式函数的本质与内部函数函数应用及闭包

在列名中使用别名创建表视图

创建分支别名? [复制]

为啥不能快速推断闭包类型

如何创建 Bash 别名?

闭包的类型别名