使用闭包参数分配闭包

3
假设我有这个类
class ClosureTest{
    var nestedClosure: (((String) -> Void) -> Void)?
}

如何给 nestedClosure 赋值?

我尝试了下面的代码,但是出现了错误。请有人帮我解释一下吗?

let cTest = ClosureTest()
cTest.nestedClosure = {{ myStr -> Void in } -> Void }
3个回答

4

首先,类型别名将有助于减少代码中所有括号的数量:

typealias InnerClosure = ((String) -> Void)

class ClosureTest{
    var nestedClosure: ((InnerClosure) -> Void)?
}

当你想给 nestedClosure 分配一个值时,你需要提供一个接受一个 InnerClosure 作为单个参数并返回无值的闭包,因此:

let cTest = ClosureTest()
cTest.nestedClosure = { (arg:InnerClosure) in
    print ("calling arg from nestedClosure:")
    arg("called from outer space") // call the inner closure
}

要使用nestedClosure,您需要提供一个具体的InnerClosure类型
let innerClosureValue:InnerClosure = { txt in
    print ("the inner closure; txt: \(txt)")
}

cTest.nestedClosure?(innerClosureValue)

然后输出结果为:
调用嵌套闭包中的arg: 内部闭包;txt:来自外层空间的调用
或者,不使用innerClosureValue变量:
cTest.nestedClosure?({ txt in
    print ("Or this: \(txt)")
})

2
放下 Optional 位,(((String) -> Void) -> Void) 是:
  • 一个函数...
    • 接受一个函数...
      • 接受一个字符串
      • 并返回 Void
    • 并返回 Void
因此,这个函数的有用版本应该是:
{ f in f("x") }

在这里,f 是一个 (String) -> Void。它将被传递到闭包中,然后闭包将 "x" 传递给它。
对于什么也不做的简单版本(就像你的例子中一样),代码如下:
{ _ in }

这句话的意思是“这个闭包需要一个参数,但不对其进行任何操作。”


0

你需要

var nestedClosure:((String) -> Void)?

使用

cTest.nestedClosure = { myStr in

}

好的,这并不符合“假设我有这个类…”的要求,因为它改变了整个问题。 - Andreas Oetjen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接