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)
}
}
我在某处发现了这个并且一直在我的代码中使用它。
我不确定为什么要用大括号和尾随括号。它们有必要吗?他们在做什么?我不确定在 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)
}
}