Swift变量声明与闭包

4

我看到了一个使我感到困惑的声明。(这里的语法有误)

static var dateFormatter: NSDateFormatter = {
    var formatter = NSDateFormatter()
    formatter.dateFormat = "yyyy-MM-dd"
    return formatter
}()

声明一个变量,看起来像使用一个函数(initializer)来创建变量。由于我对Swift中的闭包不熟悉,我找到了一些有用的教程。然而,上面的例子似乎不符合任何一个教程。 参考:http://fuckingclosuresyntax.com/ 任何建议、参考或教程都将不胜感激。


该闭包是一个返回NSDateFormatter对象的方法。 - Leo Dabus
1
{ ... } 创建一个没有参数并返回 NSDateFormatter 的闭包实例,而 () 则调用该闭包并获取闭包创建的 NSDateFormatter - findall
听起来我可以简单地将闭包中的那些代码替换为初始化器? 我尝试了这个,但是Xcode抱怨“'class var'声明需要一个初始化表达式或getter/setter说明符”。 - Yao
在您的评论中编辑您的问题,包括给您带来错误的完整代码。任何初始化程序(如NSDateFormatter())都应该可以使用,例如var formatter: NSDateFormatter = NSDateFormatter()...= theReturnValueOfSomeClosure(),如果您需要在将其分配给属性之前初始化和进一步配置结果。 - Joshua Nozzi
fuckingclosuresyntax.com不好,作者太菜了。但是做fuckingblocksyntax.com的Mike真的很棒!!! - J-Q
1个回答

6

语法

正如@findall在评论中所说,您基本上是创建一个函数并执行它。

为了澄清语法,我将尝试在JavaScript中创建一个示例。

考虑以下代码片段:

示例 #1

//creates a global variable
var globalString = "Very important global string"; 

这行代码一被解释,就会在内存中创建并存储此字符串。现在将其与另一种实现进行比较:

示例2

//also creates a global variable 
var globalString = function() {
    return "Very important global string";
};

第二种实现方式不创建一个字符串,而是创建一个最终生成字符串的函数。
在 Swift 中,当你使用 {...}() 语法声明一个变量时,实际上做的事情类似于例子 #2

用例

何时声明这种变量会有用?当声明需要进行一些额外设置时。
在问题中发布的示例中,NSDateFormatter 可能需要进行一些额外步骤才能按照应用程序预期的方式实例化。换句话说:
class ThisClass {
    //if you do this, you'll then have to configure your number formatter later on
    static var dateFormatter = NSDateFormatter()
    
    func userFormatter() {
        //you probably want this setup to take place only once
        //not every time you use the formatter
        ThisClass.dateFormatter.dateFormat = "yyyy-MM-dd"
    
        //do something with the formatter
    }
}

这个例子可以很好地替代为:

class ThisClass {
    static var dateFormatter: NSDateFormatter = {
        let formatter = NSDateFormatter()
        formatter.dateFormat = "yyyy-MM-dd"
        return formatter
    }()
    
    func userFormatter() {
        //do something with the formatter with no setup needed!
    }
}

当您使用 {...}() 格式声明变量或常量时,该闭包仅在声明变量或常量时运行一次,还是每次访问变量或常量时都会运行? - daniel
1
它只执行一次。 - Bell App Lab

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接