在C#中,我们有Object Initializers,如下所示:
Person obj = new Person
{
FirstName = "Craig",
LastName = "Playstead",
};
Run Code Online (Sandbox Code Playgroud)
斯威夫特有这个吗?
举个例子,我有这个代码:
var config = IndicatesConfig()
config.name = NSLocalizedString(Localizable.FOLDERS, comment: "").uppercaseString
config.style = .DetailHeader
return config
Run Code Online (Sandbox Code Playgroud)
但是想做一些事情:
var config = IndicatesConfig() {
name = NSLocalizedString(Localizable.FOLDERS, comment: "").uppercaseString
style = .DetailHeader
}
Run Code Online (Sandbox Code Playgroud)
谢谢!
编辑:
我没有引用类初始化器的明确定义.请记住C#示例中显示的语法.
Nat*_*ook 16
不是这样的.如果您创建自定义struct,Swift将在某些条件下创建一个接近您要查找的默认成员初始值设定项.但除此之外,我认为甚至没有办法实现这样的功能,因为Swift缺少任何类似with关键字的东西,可以让你进入新实例的范围.
更新:通过定义自定义运算符,我尽可能接近:
infix operator <| { }
func <|<T>(decl: @autoclosure () -> T, f: T -> () ) -> T {
let obj = decl()
f(obj)
return obj
}
let label = UILabel() <| {
$0.frame = CGRect(x: 10, y: 10, width: 300, height: 25)
$0.text = "Hello"
$0.enabled = false
}
println(label)
// <UILabel: 0x7fb46240b210; frame = (10 10; 300 25); text = 'Hello'; userInteractionEnabled = NO; layer = <_UILabelLayer: 0x7fb46240c2b0>>
Run Code Online (Sandbox Code Playgroud)
斯威夫特没有这样的功能.
您可以使用闭包实现类似的接口,但是......
class MyClass {
var name = ""
var style = 0
init(initializer:((MyClass)->Void)? = nil) {
initializer?(self)
}
}
let a = MyClass2() {
$0.name = "foo"
$0.style = 2
}
Run Code Online (Sandbox Code Playgroud)
这里没有隐含self,相反,你必须使用隐式闭包参数$0.
| 归档时间: |
|
| 查看次数: |
1645 次 |
| 最近记录: |