如何快速创建具有特定类型别名的闭包?
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")
【讨论】:
以上是关于如何快速创建具有特定类型别名的闭包?的主要内容,如果未能解决你的问题,请参考以下文章