2014-06-05 35 views
6

我一直在尋找蘋果提供的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

在其他語言中這樣做有意義嗎?我不這樣做,例如'if(var name ='CjCoax'){console.log('你不會在這裏')}'。它的JavaScript例子,但很好解釋你正在嘗試做什麼 – sakhunzai

+0

@cjcoax目標C和Swift的幾個區別在你的代碼中被證明:1)';'不需要,儘管編譯器安全地忽略它們。 2)不需要父母(或者在這種情況下,允許流量控制語句 –

回答

14

「模式變量綁定」是你正在做的事情,即在某些代碼的中間使用let,而不是在文件的頂層或枚舉或結構或類中聲明一個常量變量。

是什麼使它成爲括號。您已將「let」表情從周圍剪掉,並要求將其評估爲單獨表達。但是你不能這麼做:你不能在任何地方說「讓」。

查看它的另一種方法很簡單:if let是一個固定的有意義的模式,其中條件是一個可選的被評估爲一個常量用於if代碼中。圓括號打破了這種模式。

該模式被稱爲綁定,因爲您正在非常臨時地在本地定義該名稱,即僅將其定義在if-code中。我認爲它可以追溯到LISP(至少,這是我過去使用「let」這種方式的地方)。

+1

是的。擺脫父親,它是完全有效的。 – aruisdante

+2

如果你來自Ruby或類似的,失去「括號」的習慣:) – matt

+0

我不能看到一個''let''聲明而不考慮方案;) – aruisdante