首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用闭包参数赋值闭包

用闭包参数赋值闭包
EN

Stack Overflow用户
提问于 2020-08-27 13:10:41
回答 3查看 111关注 0票数 3

假设我有这门课

代码语言:javascript
复制
class ClosureTest{
    var nestedClosure: (((String) -> Void) -> Void)?
}

如何将值赋给nestedClosure

我尝试了下面的代码,但是我得到了一个错误。有人能帮我解释一下吗?

代码语言:javascript
复制
let cTest = ClosureTest()
cTest.nestedClosure = {{ myStr -> Void in } -> Void }
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2020-08-27 13:38:18

首先,类型别名有助于减少代码中的所有偏执:

代码语言:javascript
复制
typealias InnerClosure = ((String) -> Void)

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

当您想要将一个值释放到nestedClosure时,您需要提供一个闭包,该闭包以一个InnerClosure作为单个参数,而不返回任何内容,因此:

代码语言:javascript
复制
let cTest = ClosureTest()
cTest.nestedClosure = { (arg:InnerClosure) in
    print ("calling arg from nestedClosure:")
    arg("called from outer space") // call the inner closure
}

要使用nestedClosure,您需要提供一个InnerClosure类型的具体值

代码语言:javascript
复制
let innerClosureValue:InnerClosure = { txt in
    print ("the inner closure; txt: \(txt)")
}

cTest.nestedClosure?(innerClosureValue)

然后,产出是:

从nestedClosure调用arg:

内部封闭;txt:从外层空间调用

或者,不使用innerClosureValue变量:

代码语言:javascript
复制
cTest.nestedClosure?({ txt in
    print ("Or this: \(txt)")
})
票数 4
EN

Stack Overflow用户

发布于 2020-08-27 13:49:28

将可选位删除一秒钟,(((String) -> Void) -> Void)是:

  • A函数..。
    • 接受一个函数..。获取字符串Void

  • 并返回

代码语言:javascript
复制
- And returns Void

因此,其中一个有用的版本是:

代码语言:javascript
复制
{ f in f("x") }

在这方面,f是一个(String) -> Void。它将被传递给闭包,然后闭包将"x"传递给它。

对于不做任何操作的普通版本(如您的示例中的示例),代码如下:

代码语言:javascript
复制
{ _ in }

上面写着“这个闭包只接受一个参数,不会对它做任何事情。”

票数 2
EN

Stack Overflow用户

发布于 2020-08-27 13:11:58

你需要

代码语言:javascript
复制
var nestedClosure:((String) -> Void)?

使用

代码语言:javascript
复制
cTest.nestedClosure = { myStr in

}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63616750

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档