Swift构造函数括号的工作方式与Javascript IIFE括号相同吗?

时间:2017-01-28 04:02:52

标签: javascript swift constructor parentheses iife

我刚刚开始学习Javascript并简要地遇到Immediately Invoked Function ExpressionIFFE。最后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){ } } } } })(); 那么它会做什么?

2 个答案:

答案 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)