我刚刚开始学习Javascript
并简要地遇到Immediately Invoked Function Expression
或IFFE
。最后parentheses
invokes
function
。
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
是否与JS
IFFE
末尾的call
工作方式相同?如果它不function
(function () {
'use strict';
angular
.module('app.hostelsmg.bookings')
.directive('bookingsChart', bookingsChart);
function bookingsChart() {
return {
restrict: 'E',
scope: true,
controller: [function(){
$scope.test = 'Hi there!';
}],
compile: function(tElem, attrs){
tElem.html('{{test}}');
return function(scope, elems, attrs){
}
}
}
}
})();
那么它会做什么?
答案 0 :(得分:0)
我首先要指出您示例中的错误:nameTextField
初始值设定项中的代码引用greetingObject
。我们无法保证首先初始化哪个属性,因此您无法在init闭包中引用其他属性。
话虽如此,它在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
答案 1 :(得分:0)