【问题标题】:Check for certain statements in Swift closure检查 Swift 闭包中的某些语句
【发布时间】:2019-01-23 18:17:23
【问题描述】:

我写了一个函数,它接受一个闭包作为这样的参数:

func doSome(work: () -> Void = { print("sleeping...") } ) {
    work()
}

现在我想调查一下work 所做的事情。 因此我想检查给定的闭包是否包含任何打印语句。

有点像这样:

func doSome(work: () -> Void = { print("doing hard work...") } ) {
    work()

    if work.contains(print) {
        print("we did some hard work there and printed something!")
    }
}

我怎样才能做到这一点?


编辑:我想要实现的目标

一个异步函数尝试连接到一个 http 服务器——我们称之为connect。它接受一个闭包作为它的参数——称为finally。正如它的名字已经表明的那样:在连接尝试之后,闭包被执行。

如果连接尝试成功(http 响应代码 == 200),我需要调用另一个函数一次 - 让我们这样称呼它:once

connect 函数因此如下所示:

func connect(finally: () -> Void = {}) {
    httpRepsonse = asyncRequestToServer()

    if httpResponse.statusCode == 200 {
        once()
    }

    // and finally:
    finally()
}

其他函数调用connect 并传递它们的语句,它们需要连接函数执行finally

问题来了:有一个函数需要 once 每次执行,因此它在 finally 闭包中传递它。如果现在连接成功,once 会被调用两次。

这就是为什么我想检查给定的闭包是否已经包含 once 调用,所以我可以避免调用它两次。

【问题讨论】:

  • Swift 没有这种追溯能力。一方面,代码被优化,许多函数被内联等等,这使得很难判断原始函数调用是什么样的
  • 你到底想用这个实现什么?也许我们可以提出一个更可行的方法
  • 所以如果我理解的话,有一个实例,其中finally 块包含对once() 的调用,即使在状态代码不是 200 的情况下也应该发生这种情况,但是如果状态码恰好是 200,您不希望发生 2 个 once 调用吗?
  • @Alexander 是的,你理解正确。我想我可以很容易地“看看里面”给定的闭包。但是另一个布尔参数(或期望一个导致布尔值的闭包)将是最简单的解决方案
  • 与其放入这个脚手架,本质上是“这样做以适应大多数情况,然后弄清楚如何以不同的方式处理特殊情况”,而是将 HTTP 响应放入闭包中,这样每个闭包都可以准确定义它的响应方式。

标签: swift closures


【解决方案1】:

使用您在打印到控制台时更改的全局变量,并在您的内部检查它doSome(work:)

【讨论】:

    【解决方案2】:

    简短的回答:你不能。正如 Alexander 所说,Swift 不支持这一点。正如 Carpsen90 的回答中所建议的那样,您将不得不添加某种家政服务。

    【讨论】:

    • 你对我的情况有什么想法吗? (我更新了我的帖子)
    【解决方案3】:

    据我所知,查询闭包的内容并不容易。

    您可以使用一个或多个在调用函数时分配的布尔参数(如果相关)来解决问题(当然取决于您的需求和实现)。

    例如:

    func doSome(work: () -> Void = { print("doing hard work...")}, containsPrint: Bool = false) {
    
        // Call your work closure
        work()
    
        // Check conditions
        if containsPrint {
            print("We printed some stuff")
        }
    }
    

    我知道这是一个相当简单的解决方案,但它可能会提供所需的功能。

    【讨论】:

      猜你喜欢
      • 2020-07-06
      • 1970-01-01
      • 2012-09-19
      • 1970-01-01
      • 2013-04-02
      • 2019-12-29
      • 1970-01-01
      • 1970-01-01
      • 2018-05-02
      相关资源
      最近更新 更多