transportation the significado programming lenguaje language español descargar swift

the - swift wikipedia



¿Cómo debería razonar cuando tengo que elegir entre una clase, struct y enum en Swift? (7)

¡Creo que es una discusión bastante refinada! Me gustan los pensamientos expresados ​​aquí: http://www.swift-studies.com/blog/2014/7/1/struct-enum-or-class

Hay muchos detalles y sus recomendaciones. He copiado su resumen aquí, pero es un artículo completo

  • las enumeraciones se inicializan por uno de un número finito de casos, están completamente definidas por su caso, y siempre deben ser instancias válidas de ese caso cuando se crean instancias.
  • las estructuras se deben usar cuando no hay un número finito de instancias válidas (por ejemplo, casos enum) y la estructura tampoco forma una definición completa de un objeto, sino más bien un atributo de un objeto
  • Una clase define completamente a un actor primario en su modelo de objetos, tanto sus atributos como sus interacciones.

Dado que las clases, las estructuras y las enumeraciones tienen constructores, propiedades y propiedades calculadas, ¿cómo debería razonar al elegir entre ellas?



Generalmente, haría uso de estructuras sobre clases cuando los datos que está definiendo son relativamente simples, no necesita preocuparse por las referencias, o no necesita heredar las propiedades y métodos de otra estructura de datos.

Si tiene datos que no deberían modificarse después de la inicialización, podemos garantizar que en el momento de la compilación al usar las estructuras.

Use clases para situaciones donde sepa que la identidad del objeto va a ser importante. En otras palabras, use clases donde desee que varias regiones de código apunten a la misma instancia del objeto.

Usa estructuras para situaciones donde sabes que el valor del objeto importa. En otras palabras, las estructuras son ideales para situaciones en las que no importa si dos regiones diferentes de código se refieren a la misma instancia de copia de la instancia

Si necesita compartir estado mutable entre partes de su programa, debe usar una clase.

Si necesita herencia o sabe que quiere pasar referencias a un objeto, use una clase.


La diferencia más importante entre clases y otros tipos nombrados (structs / enums) es:

Las estructuras no pueden ser subclases (o subestructuras, por así decirlo) de nada. Tampoco pueden ser subclasificados ellos mismos. La herencia está completamente fuera de imagen con las estructuras. Lo mismo ocurre con enums.


Las respuestas de ChristopheD y Jack Wu son buenas, pero creo que no tocan enums, o pierden su importancia. Las enumeraciones de Swift son (se supone que deben ser) una implementación completa de tipos de datos algebraicos. Las clases y las estructuras se usan tradicionalmente para modelar datos en lenguajes orientados a objetos, pero las enumeraciones generalmente se limitan a ser usadas como una manera conveniente de limitar el valor de una variable a un número limitado de posibilidades. Ej. (C ++):

enum MaritalStatus { Unmarried, Married, Divorced, WidowedOrWidowered }; MaritalStatus m = Unmarried;

Las enums de Swift pueden hacer lo anterior, pero pueden hacer mucho más. Por supuesto, la Guía de idiomas tiene un buen ejemplo de modelado de código de barras, pero el mejor ejemplo que conozco que realmente lleva a casa el punto de modelar datos con tipos de datos algebraicos es la presentación de Scott Wlaschin: http://www.slideshare.net/ScottWlaschin/ddd-with-fsharptypesystemlondonndc2013

Probablemente se beneficiaría al pasar por toda la presentación, pero realmente para ''obtener'' el punto, todo lo que necesita ver es la diapositiva 60, donde muestra cómo modelar un ''método de pago'' en una aplicación típica de la línea de negocio.

Los ejemplos en la presentación están en F # pero F # no está tan lejos de Swift y usted puede fácilmente mapear entre ellos. Por ejemplo, la enumeración de métodos de pago en Swift se vería así:

enum PaymentMethod { case cash // No extra data needed. case cheque(Int) // Cheque #. case card(CardType, CardNumber) // 2 pieces of extra data. }

El punto de lo anterior es que el método de pago de cada orden puede ser solo uno de los tres métodos anteriores. Cualquier otra cosa no será permitido por el compilador. Esta es una alternativa muy sucinta a la construcción de jerarquías de clases completas para modelar estas cosas casi triviales.

La presentación realmente despega desde allí y la mejor parte es que Swift puede hacer casi todo lo que F # puede en términos de modelado de datos, utilizando tipos opcionales, etc.


Para empezar, las clases se pasan por referencia y las estructuras se pasan de una copia a otra.

enums son todavía un tipo especial para especificar, bueno, enumeraciones. Deben usarse como antes.

En general, la elección de Clase vs Estructura no debería ser muy diferente a la anterior. Las clases siguen siendo aptas para objetos más grandes / complejos y las estructuras son buenas para objetos modelo pequeños y aislados. El hecho de que las estructuras tengan protocolos y demás ahora solo debería servir para simplificar su código y hacerlo más eficiente.


Las estructuras tienen inicializadores de miembro (las instancias de clase no reciben un inicializador de miembro predeterminado)

Todas las estructuras tienen un inicializador de miembro generado automáticamente, que puede usar para inicializar las propiedades de los miembros de las nuevas instancias de estructura. Los valores iniciales para las propiedades de la nueva instancia se pueden pasar al inicializador de miembro por nombre:

let vga = Resolution(width: 640, height: 480)

lo cual tiene perfecto sentido ya que son tipos de valores (y por lo tanto immutable ).

Las enumeraciones también son tipos de valores. Las clases son tipos de referencia. No hay sorpresas reales aquí.