Nicht in Swift mögen, weil:
Extensions werden statisch aufgelöst. Erweiterungen ändern Klassen, die sie erweitern, nicht wirklich. Wenn Sie eine Erweiterung definieren, fügen Sie keine neuen Member in eine Klasse ein, sondern machen lediglich neue Funktionen, die mit der Punktnotation auf Variablen dieses Typs aufgerufen werden können. (Source)
Wenn ein Begleitobjekt in Ihrer Zielklasse definiert ist, geht mit s1m0nw1's approach. Der Vorteil ist, dass Sie die Erweiterungsfunktion ohne eine Instanz (statisch) der Zielklasse aufrufen können.
Wenn nicht, verwenden Sie ein klassisches Werk Muster:
class Fruit(var name: String = "") {
}
class FruitFactory {
companion object {
fun create(name: String): Fruit {
return Fruit().apply {
this.name = "Tasty $name"
}
}
}
}
fun main(args: Array<String>) {
val orange = Fruit("Orange")
println(orange.name)
val apple = FruitFactory.create("Apple")
println(apple.name)
}
Sie können die Fabrik erweitern, wie Sie mit weiteren Konstrukteure wollen entweder verschachtelte oder als Erweiterungsfunktionen.
Ausgang:
orange
Leckere Apfel
Dies imitiert nicht den Konstruktor, es ist das Fabrikmuster :) –
Sie haben Recht, aber das hat einen Unterschied, müssen Sie Factory.foo (123) nicht aufrufen. Sugar Code auf jeden Fall – Aracem
@WilliMentzel Es ahmt einen Konstruktor für die Clients nach: Sie nennen es genauso wie sie einen Konstruktor und müssen nicht wissen, was es ist. –