【问题标题】:Swift: how to optionally pass function as parameter and invoke the function?Swift:如何选择性地将函数作为参数传递并调用函数?
【发布时间】:2015-05-01 04:14:12
【问题描述】:

如何选择将一个函数传递给另一个函数?具体来说,假设 functionA 接受 functionB 作为参数。如果functionB不是nil,怎么在functionA里面执行functionB呢?

【问题讨论】:

    标签: ios swift


    【解决方案1】:

    很难看出这有什么难处,所以也许这不是你的意思,因为它看起来如此微不足道;但无论如何,这里是:

    func optionalFunctionExpecter(f:(()->())?) {
        f?()
    }
    

    以下是如何使用实际函数调用它:

    func g() {
        println("okay")
    }
    optionalFunctionExpecter(g)
    

    或者,使用实际的匿名函数调用它:

    optionalFunctionExpecter { println("okay2") }
    

    以下是使用nil 调用它的方法:

    optionalFunctionExpecter(nil)
    

    请注意,在我的optionalFunctionExpecter 实现中,当使用nil 调用时,什么都不会发生:我们不会调用f,我们不会崩溃,我们不会做任何事情。如果您需要知道 nil 已通过,您可以轻松找到:只需在 optionalFunctionExpecter 中询问是否是 f == nil 并根据需要在此基础上继续操作。为了更灵活,我们可以这样重写:

    func optionalFunctionExpecter(f:(()->())?) {
        if let f = f {
            f()
        } else {
            // ... nil was passed, respond to that fact ...
        }
    }
    

    【讨论】:

    • 很抱歉给您带来了困惑。如果有人将 nil 传递给 optionalFunctionExpecter 怎么办?换句话说,有时一个函数会被传递,而其他时候,没有函数被传递。如果函数为nil,"f?()" 不会抛出异常吗?
    • No – f?() 是可选链接(类似于maybeObj?.propertymaybeArray?[0]。如果将检查f 是否为nil,如果不是,则执行它。返回值将被包裹在一个可选项中,如果 fnil 并且未执行,则返回值是 nil
    • @Crashalot 查看stackoverflow.com/a/29717211/3925941 了解一长串可选处理技术
    • 谢谢@AirspeedVelocity!
    • @Relequestual 它说参数f 是一个不带参数也不返回值的函数,封装在一个 Optional 中——这是 OP 要求的。这是我书中关于函数作为参数的讨论:apeth.com/swiftBook/ch02.html#_function_as_value
    猜你喜欢
    • 1970-01-01
    • 2017-11-04
    • 2021-04-13
    • 2019-08-08
    • 1970-01-01
    • 2021-12-29
    • 2016-02-16
    • 2015-07-21
    • 2017-04-13
    相关资源
    最近更新 更多