У Swift есть неявный инициализатор объектов, как в С#?

В С# у нас есть Инициализаторы объектов, например:

    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
}

Спасибо!

изменить:

Я не ссылаюсь на явное определение инициализаторов класса. Пожалуйста, учтите синтаксис, показанный на примере С#.

Ответы

Ответ 1

Не как таковой. Если вы создадите пользовательский 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>>

Ответ 2

У 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.

Ответ 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)