2016-06-29 3 views
1

Im чтение Strong reference cycle for closure от Apple docs. Ниже приводится заявление ленивого вара с помощью закрытия:краткая форма закрытия в быстрой, ленивой загрузке

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

Ниже приведен синтаксис закрытия в Swift

{(parameters) -> return type in 
    statements 
} 

Они не выглядят одинаково, но я знаю, что первая asHTML является короткой формой закрытие

Может кто-то ходить мне через, как я получить короткую форму формы первоначального синтаксис

ответ

3

декларация гласит

() -> String 

Это означает, что замыкание не принимает никаких аргументов и выдает строку при вызове. Это закрытие сильно захватывает переменную self, чтобы иметь возможность использовать текст.

Если мы возьмем определение замыкания

{(parameters) -> return type in 
    statements 
} 

выше asHTML можно переписать в виде

{() -> String in 
    statements 
} 

Или

{ (Void) -> String in 
    statements 
} 

Что такое же, как

lazy var asHTML = asHTML() 

func asHTML() -> String { 
    .... 
} 

В качестве дополнительной записки, вы также можете переписать ленивую декларацию asHTML в

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

Swift позволяет опускать части синтаксиса закрытия в зависимости от контекста, чтобы сделать его более легким для чтения.

В ваш случай вы назначаете автозаполнение переменной asHTML.

Из документации компании Apple о autoclosures

autoclosure является замыкание, которое создается автоматически, чтобы обернуть выражение, это время передается в качестве аргумента функции. Он не принимает никаких аргументов, и когда он вызывается, он возвращает значение выражения, которое завершено внутри него. Это синтаксическое значение удобство позволяет опускать фигурные скобки вокруг параметра функции на , записывая нормальное выражение вместо явного закрытия.

Подробнее о синтаксисе автозакрытий и замыканий можно узнать больше here.

Смежные вопросы