快速,懒惰装载的短形式

时间:2016-06-29 12:40:52

标签: ios swift swift2 closures lazy-loading

我正在阅读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是一种简短形式的闭合

有人可以告诉我如何从原始语法中获取简短形式

2 个答案:

答案 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的更多信息。