我一直在看苹果提供的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
是什么意思,为什么它不能出现在表达式中?
答案 0 :(得分:14)
A&#34;模式变量绑定&#34;是你正在做的事情,即在某些代码的中间使用let
,而不是在文件或枚举或结构或类的顶层,作为声明常量变量的方式。
括号是什么使它成为表达式。你已经削减了&#34; let&#34;从周围环境中表达出来,并要求将其作为一个单独的表达来评价。但你不能这样做:你不能说&#34;让&#34;就在任何地方。
另一种看待它的方法就是这样:if let
是一个固定的有意义的模式,其中条件是一个可选的被评估为常量以便在if-code中使用。括号分解了这种模式。
该模式称为绑定,因为您非常临时和本地定义此名称,即仅限于if代码。我认为这可以追溯到LISP(至少,我已经使用过的&#34;让#34;过去这种方式)。