模式变量绑定不能出现在表达式中

时间:2014-06-05 03:27:49

标签: swift

我一直在看苹果提供的Swift编程语言指南。 以下示例来自本书:

class HTMLElement {
    let name :String;
    let text: String?;

    @lazy var asHTML : () -> String = {
        if let text = self.text {
            return "<\(self.name)>\(self.text)</\(self.name)>";
        } else {
            return "<\(self.name) />"
        }
    }
}

我错误地将闭包写成如下:

    @lazy var asHTML : () -> String = {
        if (let text = self.text) {
            return "<\(self.name)>\(self.text)</\(self.name)>";
        } else {
            return "<\(self.name) />"
        }
    }

请注意let text = self.text周围的括号和编译器抱怨:

  

模式变量绑定不能出现在表达式

只是想知道Pattern Variable Binding是什么意思,为什么它不能出现在表达式中?

1 个答案:

答案 0 :(得分:14)

A&#34;模式变量绑定&#34;是你正在做的事情,即在某些代码的中间使用let,而不是在文件或枚举或结构或类的顶层,作为声明常量变量的方式。

括号是什么使它成为表达式。你已经削减了&#34; let&#34;从周围环境中表达出来,并要求将其作为一个单独的表达来评价。但你不能这样做:你不能说&#34;让&#34;就在任何地方。

另一种看待它的方法就是这样:if let是一个固定的有意义的模式,其中条件是一个可选的被评估为常量以便在if-code中使用。括号分解了这种模式。

该模式称为绑定,因为您非常临时和本地定义此名称,即仅限于if代码。我认为这可以追溯到LISP(至少,我已经使用过的&#34;让#34;过去这种方式)。