2014-06-05 15 views
6

Tôi đã xem hướng dẫn Ngôn ngữ lập trình Swift được cung cấp bởi apple. mẫu Sau đây là từ cuốn sách:Ràng buộc biến mẫu không thể xuất hiện trong biểu thức

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) />" 
     } 
    } 
} 

tôi sai viết đóng cửa như sau:

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

Thông báo ngoặc xung quanh let text = self.text và trình biên dịch phàn nàn về:

Pattern biến ràng buộc không thể xuất hiện trong một biểu thức

Chỉ cần tự hỏi Pattern Variable Binding là gì và tại sao nó không thể xuất hiện trong một biểu thức?

+0

Có cần thiết để làm sth như thế này bằng các ngôn ngữ khác không? Tôi không điều như vậy ví dụ: nếu (var name = 'CjCoax') {console.log ('bạn sẽ không vi phạm ở đây')} '. Ví dụ javascript của nó nhưng tốt để giải thích những gì bạn đang cố gắng làm – sakhunzai

+0

@cjcoax một số khác biệt với mục tiêu-C và nhanh chóng được thể hiện trong mã của bạn: 1) ';' không cần thiết, mặc dù trình biên dịch một cách an toàn bỏ qua chúng. 2) Parens là không cần thiết (hoặc trong các trường hợp như thế này, cho phép trong báo cáo kiểm soát dòng chảy –

Trả lời

14

Một "mô hình biến ràng buộc" là điều bạn đang làm, tức là sử dụng let ở giữa một số mã, không phải ở cấp cao nhất của tệp hoặc enum hoặc struct hoặc lớp như một cách khai báo biến cố định .

Điều gì làm cho biểu thức đó là dấu ngoặc đơn. Bạn đã cắt bỏ biểu thức "let" ra khỏi môi trường xung quanh và yêu cầu đánh giá nó như một biểu thức riêng biệt. Nhưng bạn không thể làm điều đó: bạn không thể nói "để" ở bất cứ đâu. Một cách nhìn khác đơn giản là: if let là một mẫu có ý nghĩa cố định, trong đó điều kiện là tùy chọn được đánh giá thành hằng số để sử dụng bên trong mã if. Dấu ngoặc đơn đã phá vỡ hình mẫu.

Mẫu được gọi là ràng buộc bởi vì bạn đang xác định tên này rất tạm thời và cục bộ, tức là chỉ duy nhất vào mã if. Tôi nghĩ rằng nó quay trở lại LISP (ít nhất, đó là nơi tôi đã sử dụng "để" theo cách này trong quá khứ).

+1

Yep. Loại bỏ các parens và nó hoàn toàn hợp lệ. – aruisdante

+2

Nếu bạn đến từ Ruby hoặc tương tự, mất thói quen "ngoặc" rất dễ. :) – matt

+0

Tôi không thể nhìn thấy câu lệnh '' let'' mà không nghĩ đến sơ đồ;) – aruisdante

Các vấn đề liên quan