Swift 声明中的`{ SomeClass().func() }()` 语法是什么意思?

What does`{ SomeClass().func() }()` syntax mean in a Swift declaration?

我在某处发现了这个并且一直在我的代码中使用它。

我不确定为什么要用大括号和尾随括号。它们有必要吗?他们在做什么?我不确定在 Swift 文档中的哪个位置可以找到它。

var textField = { UITextField.textFieldWithInsets(insets: UIEdgeInsets(top:0, left:5, bottom:0, right:15)) }()

大括号和尾随括号定义了一个立即调用的 closure,其 return 值立即分配给 textField 变量。这个one-liner相当于写

var textField = {
    return UITextField.textFieldWithInsets(insets: UIEdgeInsets(top:0, left:5, bottom:0, right:15))
}()

因为闭包只包含一行,the return keyword can be omitted,并且闭包被挤压到一条信号线上。

在这种情况下,闭包的定义和调用完全是多余的,相当于只写

var textField = UITextField.textFieldWithInsets(insets: UIEdgeInsets(top:0, left:5, bottom:0, right:15))

但是,这种将闭包结果分配给变量的方式是 not-uncommon 将跨多行创建和配置变量的结果分配给结果变量的方法,例如

var textField: UITextField = {
    let field = UITextField()
    field.font = ...
    field.textColor = ...
    field.translatesAutoresizingMasksIntoConstraints = false
    return field
}()

如果 textField 是一个 local 变量,这种风格也是多余的(因为你可以创建变量,然后配置它),但在分配一个变量时很常见instance 变量的默认值,以在初始化程序之外执行一致的设置和初始化。例如:

class MyComponent: UIView {
    // Instance variable default values are assigned
    // before initializers are called. If we assign a value here
    // then we don't need to duplicate code across our inits.
    var textField: UITextField = { /* some configuration */ }()
    
    init(text: String) {
        // textField is already initialized and configured.
        textField.text = text
    }

    init(someValue: Int) {
        // textField is already initialized and configured.
        textField.text = someCalculationBased(on: someValue)
    }
}