我正在阅读Apple文档中的Strong reference cycle for closure
。下面是使用闭包的lazy var的声明:
lazy var asHTML: () -> String = {
if let text = self.text {
return "<\(self.name)>\(text)</\(self.name)>"
} else {
return "<\(self.name) />"
}
}
以下是Swift中的闭包语法
{(parameters) -> return type in
statements
}
它们看起来不一样,但我知道第一个asHTML
是一种简短形式的闭合
有人可以告诉我如何从原始语法中获取简短形式
答案 0 :(得分:3)
声明如下:
() -> String
这意味着闭包不带参数,并在调用时生成一个String。此闭包强有力地捕获变量self以便能够使用文本。
如果我们采用闭包定义
{(parameters) -> return type in
statements
}
以上asHTML可以改写为
{ () -> String in
statements
}
或者
{ (Void) -> String in
statements
}
与
相同lazy var asHTML = asHTML()
func asHTML() -> String {
....
}
作为补充说明,您还可以将惰性asHTML声明重写为
lazy var asHTML: String = {
if let text = self.text {
return "<\(self.name)>\(text)</\(self.name)>"
} else {
return "<\(self.name) />"
}
}()
答案 1 :(得分:3)
Swift允许您根据上下文省略部分闭包语法,以便于阅读。
在你的情况下,你为autHTML变量分配一个autoclosure。
来自Apple关于autoclosures的文档
autoclosure是一个自动创建的封装,用于封装 表达式作为参数传递给函数。它 不接受任何参数,当它被调用时,它返回值 包含在其中的表达式。 这句法 方便让你省略函数参数的大括号 写一个正常的表达式而不是一个明确的闭包。
您可以阅读有关autoclosures和闭包语法here的更多信息。