在C#中,我们有Object Initializers,如下所示:
Person obj = new Person
{
FirstName = "Craig",
LastName = "Playstead",
};
Swift有这个吗?
例如,我有这段代码:
var config = IndicatesConfig()
config.name = NSLocalizedString(Localizable.FOLDERS, comment: "").uppercaseString
config.style = .DetailHeader
return config
但是想做一些事情:
var config = IndicatesConfig() {
name = NSLocalizedString(Localizable.FOLDERS, comment: "").uppercaseString
style = .DetailHeader
}
谢谢!
编辑:
我没有引用类初始化器的明确定义。请记住C#示例中显示的语法。
答案 0 :(得分:15)
不是这样的。如果您创建自定义struct
,Swift会在某些条件下创建一个接近您要查找的default memberwise initializer。但除此之外,我认为甚至没有办法实现这样的功能,因为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>>
答案 1 :(得分:7)
斯威夫特没有这样的功能。
您可以使用闭包实现类似的界面,但是......
class MyClass {
var name = ""
var style = 0
init(initializer:((MyClass)->Void)? = nil) {
initializer?(self)
}
}
let a = MyClass2() {
$0.name = "foo"
$0.style = 2
}
此处没有隐式self
,而是必须使用隐式闭包参数$0
。
答案 2 :(得分:3)
可能我不理解,但Swift确实有初始化器。默认情况下,初始值设定项不接受任何参数,但您始终可以添加其他带有任意参数的初始值设定项...
class MyClass {
var _name: String
var _style: Int = 0
init() {
_name = ""
}
init(_ name : String) {
_name = name
}
}
如果您想添加初始值设定项,可以编写扩展名
extension MyClass {
convenience init(_ name: String, style: Int) {
self.init(name)
_style = style
}
}
然后,您可以使用以下任一方法实例化此对象:
var a = MyClass()
var b = MyClass("Billy")
var c = MyClass("Jimmy", 5)
答案 3 :(得分:0)
这是一个古老的问题,但是我在寻找答案时仍然偶然发现了这个问题。到目前为止,我了解到您可以使用便捷构造函数并传递闭包来完成某些事情。希望这对任何人都有帮助。
extension Person {
public convenience init(_ closure: (Person) -> ()) {
self.init()
closure(self)
}
public convenience init(city: String, _ closure: (Person) -> ()) {
self.city = city
self.init()
closure(self)
}
}
// usage
var person = Person() { (p: Person)
p.FirstName = "Craig"
p.LastName = "Playstead"
})
var person = Person(city: "Phoenix") { (p: Person)
p.FirstName = "Craig"
p.LastName = "Playstead"
})