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

CjC*_*oax 6 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) />"
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我错误地写了关闭如下:

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

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

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

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

mat*_*att 14

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

什么使它成为一个表达是括号.你已经从周围环境中删除了"let"表达,并要求将其作为一个表达式单独评估.但你不能那样做:你不能在任何地方说"让".

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

该模式称为绑定,因为您非常临时和本地定义此名称,即仅限于if代码.我认为它可以追溯到LISP(至少,这是我过去以这种方式使用"let"的地方).

  • 如果你来自Ruby或类似的东西,失去"括号"的习惯很容易.:) (2认同)