Swift是否有一个隐式的对象初始值设定项,如C#?

Swift是否有一个隐式的对象初始值设定项,如C#?,swift,Swift,在C#中,我们有对象初始值设定项,如下所示: Person obj = new Person { FirstName = "Craig", LastName = "Playstead", }; 斯威夫特有这个吗 例如,我有以下代码: var config = IndicatesConfig() config.name = NSLocalizedString(Localizable.FOLDERS, comment: "").upperca

在C#中,我们有对象初始值设定项,如下所示:

    Person obj = new Person
    {
        FirstName = "Craig",
        LastName = "Playstead",
    };
斯威夫特有这个吗

例如,我有以下代码:

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

并非如此。如果您创建一个自定义的
结构
,Swift将在特定条件下创建一个接近您所要查找的结构。但除此之外,我认为甚至没有办法实现这样的功能,因为Swift缺少类似于带有关键字的
,可以让您进入新实例的范围

更新:通过定义自定义运算符,这是我能得到的最接近的结果:

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>>
infix操作符())->T{
设obj=decl()
f(obj)
返回obj
}

let label=UILabel()Swift没有这样的功能

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

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

可能我不理解,但是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)

这是一个老生常谈的问题,但我在寻找答案的过程中仍然偶然发现了这个问题。到目前为止,我已经了解到,您可以使用一个方便的构造函数并传入一个闭包来完成一些关闭操作。希望这有助于任何人寻找

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

你没有在苹果的Swift书籍中找到答案?真的吗?为什么要投反对票?不,我没有。我就在这儿开着。也许我不够清楚。我没有提到类初始值设定项的定义。C#有这种语法的原因是它没有Swift所具有的高级特性:扩展初始值设定项和命名元组。在没有命名元组的情况下,对于C#的匿名类型(其开销必须是对象),语法是有意义的。目前的情况是,如果你做了你正在做的事情,那么一次,你从对象初始值设定项中得不到任何好处。如果您做两次,那么您应该创建自己的扩展初始值设定项。如果您使用
等效项定义自己的
,并且不喜欢所有的
$0
,您还可以使用简短的闭包参数命名语法:例如,
let label=UILabel(),这很好
f
可以在Swift 1.2中使用
@noescape
进行注释。但是为什么要将
decl
设置为函数而不仅仅是
T
?在Swift2.2中,函数原型应该更改为
func…
是否有
struct
默认成员初始化器的示例?除了下划线之外,这是合适的解决方案。这不是OP所说的。他说的是一个初始值设定项,您不必手动编写,并且可以选择为其提供值