检查Swift闭包中的某些语句

时间:2018-08-16 18:04:54

标签: swift closures

我编写了一个函数,该函数将闭包作为这样的参数:

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调用,因此可以避免两次调用。

3 个答案:

答案 0 :(得分:1)

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

您可以使用一个或多个布尔参数(如果相关)来变通(取决于您的需求和实现方式),在调用函数时,您将为其分配一个或多个布尔参数。

例如:

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")
    }
}

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

简短的回答:您不能。正如亚历山大所说,斯威夫特不支持这一点。正如Carpsen90的答案中所建议的那样,您将必须添加某种内务处理。