2017-01-28 11 views
0

Я только начал учиться Javascript и пробежал по Immediately Invoked Function Expression или IFFE для краткости. parentheses в конце сразу invokesfunction.Столбцы конструктора Swift работают так же, как круглые скобки Javascript IIFE?

var greetingsObject = function(name){ 
    return 'Hello' + name; 
}(); //will return Hello undefined 

В Swift я также узнать, как programmatically создавать объекты. Я создаю UILabel

var greetingsObject: UILabel = { 
let label = UILabel() 
label.text = "Hello " + nameTextField.text! 
return label 
}() 

Мой вопрос делает parentheses в конце Swift объекта работают точно так же, как тот, в конце JSIFFE? Если это не callfunction, то что он делает?

+0

Вы пробовали его, чтобы увидеть, что произойдет? – Alexander

+0

@ Александр Не понимаю вас. Я что-то пробовал? Код Swift работает отлично, я просто хочу знать, работает ли construtor() так же, как и() в js iffe. –

+0

У вас есть гипотеза: «скобки в конце объекта Swift работают так же, как и в конце JS IFFE?». Расширяя значение JS IFFE, мы получаем эквивалентный вопрос: «скобки в конце закрытия Swift вызывает закрытие»? Какие шаги вы предприняли для проверки своей гипотезы? – Alexander

ответ

0

Прежде всего я хочу указать на ошибку в вашем примере: ваш код nameTextField в инициализаторе для greetingObject. Нет гарантии, что сначала будет инициализировано свойство, поэтому вы не можете ссылаться на другое свойство в закрытии инициализации.

Сказав это, он работает в Swift как Javascript. greetingsObject будет инициализирован при инициализации экземпляра класса. Этот pawttern обычно используется, когда вы хотите, чтобы свойство было инициализировано только один раз и делилось между несколькими экземплярами.

Swift также расширил концепцию с помощью дополнительного модификатора lazy. С lazy он будет инициализировать свойство при первом обращении к нему.

class ViewController : UIViewController { 
    lazy var greetingsObject: UILabel = { 
     print("Initialzing greetingsObject") 

     let label = UILabel() 
     label.text = "Hello World" 
     return label 
    }() 
} 

let vc = ViewController() // `greetingsObject` is not yet initialized 

print("First reference to greetingsObject") 
vc.greetingsObject.text // it will be initialized here 
+0

Здравствуйте, спасибо за ответ. О вашем первом комментарии. Почему нет гарантии того, какое свойство будет сначала инициализировано? Я знаю, что ленивый инициализирует объект только тогда, когда его сначала называют. Вы говорите, что если имяTextField инициализируется перед greetingsObject (или наоборот), в котором произошел сбой, и почему он не должен ссылаться на закрытие? –

+0

Единственное место, где вы можете быть уверены, что свойство было инициализировано до того, как другое свойство находится внутри функции 'init'. Уведомление на языке говорит, что Swift инициализирует 'nameTextField' (возможно, подключив выход) до' greetingsObject', чтобы вы могли использовать неинициализированный объект –

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

  • Нет связанных вопросов^_^