objetos multiple herencia constructores clases swift properties swift2 instance

multiple - Creación de objetos en un paso e inicialización de propiedades en Swift?



objetos en swift (5)

¿Hay alguna manera de asignar valores de propiedad a una instancia de clase incluso si no es un parámetro en el constructor de init? Por ejemplo, en C # puedo hacer esto:

public class Student { public string firstName; public string lastName; } var student1 = new Student(); var student2 = new Student { firstName = "John", lastName = "Doe" };

Aviso para el student2 Aún puedo asignar valores durante la inicialización aunque no haya ningún constructor en la clase.

No pude encontrar en la documentación si puedes hacer algo como esto para Swift. Si no, ¿hay alguna manera de usar extensions para extender la clase de Student para asignar valores de propiedad durante la inicialización?

La razón por la que estoy buscando esto es para poder agregar un conjunto de instancias a una matriz sin crear variables explícitamente para cada instancia de estudiante, como esta:

var list = new[] { new Student { firstName = "John", lastName = "Doe" }, new Student { firstName = "Jane", lastName = "Jones" }, new Student { firstName = "Jason", lastName = "Smith" } }

¿Alguna forma nativa o elegante de lograr esto en Swift?


La razón por la que estoy buscando esto es para poder agregar un conjunto de instancias a una matriz sin crear explícitamente variables para cada instancia de estudiante [.]

No estoy familiarizado con C #, pero en Swift, puedes hacer eso simplemente inicializando los objetos dentro de la declaración de la matriz:

var list: [Student] = [ Student(firstName: "John", lastName: "Doe"), Student(firstName: "Jane", lastName: "Jones"), Student(firstName: "Jason", lastName: "Smith") ]

Los otros enfoques sugeridos son todos igualmente válidos, pero si simplemente intenta llenar una matriz sin declarar ninguna variable, Swift lo hace fácil.


Si su clase no tiene inicializador requerido, puede usar un método de cierre para establecer las propiedades del Estudiante antes de devolver el nuevo objeto Estudiante de la siguiente manera:

public class Student { var firstName = String() var lastName = String() } let student1 = Student() let student2: Student = { let student = Student() student.firstName = "John" student.lastName = "Doe" return student }() print(student2.firstName) // John print(student2.lastName) // Doe


Solo quería señalar que si su estructura puede ser inmutable, puede usar una struct lugar de una class y obtendrá un inicializador implícito gratis:

Simplemente pegue esto en un patio de juegos y cambie la estructura a la clase y verá lo que quiero decir.

struct Student { var firstName : String? var lastName : String? } var student = Student(firstName: "Dan", lastName: "Beaulieu")


Tiene un par de opciones según cómo quiera configurar este tipo y qué sintaxis es la más conveniente para usted.

Podría definir un inicializador conveniente que acepte las propiedades que desea establecer. Es útil si está configurando las mismas propiedades todo el tiempo, menos útil si está configurando un conjunto incoherente de propiedades opcionales.

public class Student { public var firstName:String?; public var lastName:String?; } extension Student { convenience init(firstName: String, lastName: String) { self.init() self.firstName = firstName self.lastName = lastName } } Student(firstName: "Any", lastName: "Body")

Podría definir un inicializador de conveniencia que acepte un bloque para configurar la nueva instancia.

extension Student { convenience init(_ configure: (Student) -> Void ) { self.init() configure(self) } } Student( { $0.firstName = "Any"; $0.lastName = "Body" } )

Podría imitar el método de tap de Ruby como una extensión para que pueda operar en un objeto en el medio de una cadena de métodos.

extension Student { func tap(block: (Student) -> Void) -> Self { block(self) return self } } Student().tap({ $0.firstName = "Any"; $0.lastName = "body"})

Si ese último es útil, es posible que desee adoptar el tap en cualquier objeto. No creo que pueda hacerlo automáticamente, pero puede definir una implementación predeterminada para que sea más fácil:

protocol Tap: AnyObject {} extension Tap { func tap(block: (Self) -> Void) -> Self { block(self) return self } } extension Student: Tap {} Student().tap({ $0.firstName = "Any"; $0.lastName = "body"})


Esto es solo dulces sintácticos, pero utilizo un operador personalizado para hacer este tipo de cosas:

infix operator <- { associativity right precedence 90 } func <-<T:AnyObject>(var left:T, right:(T)->()) -> T { right(left) return left } let rgbButtons:[UIButton] = [ UIButton() <- { $0.backgroundColor = UIColor.redColor() }, UIButton() <- { $0.backgroundColor = UIColor.greenColor() }, UIButton() <- { $0.backgroundColor = UIColor.blueColor() } ]