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

时间:2014-11-19 14:49:13

标签: swift

在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#示例中显示的语法。

4 个答案:

答案 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"
})