【问题标题】: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 了解了有关闭包的详细信息,但我无法定义包所期望的正确闭包类型)

【问题讨论】:

    标签: ios swift closures


    【解决方案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")
    }
    

    【讨论】:

      猜你喜欢
      • 2011-08-05
      • 2014-07-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-08
      • 2016-10-20
      • 2015-11-20
      • 1970-01-01
      相关资源
      最近更新 更多