Swift有一个隐含的对象初始化器,就像在C#中一样吗?

nmd*_*ias 15 swift

在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)


rin*_*aro 7

斯威夫特没有这样的功能.

您可以使用闭包实现类似的接口,但是......

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.