我编写了一个函数,该函数将闭包作为这样的参数:
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
调用,因此可以避免两次调用。
答案 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的答案中所建议的那样,您将必须添加某种内务处理。