cle*_*ght 0 initialization declaration object swift
我在某个地方找到了这个并一直在我的代码中使用它。
我不确定为什么要加上大括号和尾随括号。它们有必要吗?他们在做什么?我不知道在 Swift 文档中哪里可以找到它。
var textField = { UITextField.textFieldWithInsets(insets: UIEdgeInsets(top:0, left:5, bottom:0, right:15)) }()
Run Code Online (Sandbox Code Playgroud)
括起来的大括号和尾随括号定义了一个立即调用的闭包,并且其返回值立即分配给变量textField
。这句话相当于写
var textField = {
return UITextField.textFieldWithInsets(insets: UIEdgeInsets(top:0, left:5, bottom:0, right:15))
}()
Run Code Online (Sandbox Code Playgroud)
因为闭包只包含一行,所以可以省略关键字,return
并且闭包被压缩到一条信号线上。
在这种情况下,闭包的定义和调用是完全多余的,这相当于只写
var textField = UITextField.textFieldWithInsets(insets: UIEdgeInsets(top:0, left:5, bottom:0, right:15))
Run Code Online (Sandbox Code Playgroud)
然而,这种将闭包结果分配给变量的方式是将跨多行创建和配置变量的结果分配给结果变量的一种常见方法,例如
var textField: UITextField = {
let field = UITextField()
field.font = ...
field.textColor = ...
field.translatesAutoresizingMasksIntoConstraints = false
return field
}()
Run Code Online (Sandbox Code Playgroud)
textField
如果是局部变量,这种样式也是多余的(因为您可以只创建变量,然后配置它),但在为实例变量分配默认值时很常见,以便在初始化程序之外执行一致的设置和初始化。例如:
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)
}
}
Run Code Online (Sandbox Code Playgroud)