Swift Language
Estructuras
Buscar..
Fundamentos de Estructuras
struct Repository {
let identifier: Int
let name: String
var description: String?
}
Esto define una estructura de Repository
con tres propiedades almacenadas, un identifier
entero, un name
cadena y una description
cadena opcional. El identifier
y el name
son constantes, ya que se han declarado usando la palabra clave let
. Una vez configurados durante la inicialización, no se pueden modificar. La descripción es una variable. Al modificarlo se actualiza el valor de la estructura.
Los tipos de estructura reciben automáticamente un inicializador de memberwise si no definen ninguno de sus propios inicializadores personalizados. La estructura recibe un inicializador de memberwise incluso si tiene propiedades almacenadas que no tienen valores predeterminados.
Repository
contiene tres propiedades almacenadas de las cuales solo la description
tiene un valor predeterminado ( nil
). Además, no define inicializadores propios, por lo que recibe un inicializador de memberwise de forma gratuita:
let newRepository = Repository(identifier: 0, name: "New Repository", description: "Brand New Repository")
Las estructuras son tipos de valor
A diferencia de las clases, que se pasan por referencia, las estructuras se pasan a través de la copia:
first = "Hello"
second = first
first += " World!"
// first == "Hello World!"
// second == "Hello"
La cadena es una estructura, por lo tanto, se copia en la asignación.
Las estructuras tampoco se pueden comparar usando el operador de identidad:
window0 === window1 // works because a window is a class instance
"hello" === "hello" // error: binary operator '===' cannot be applied to two 'String' operands
Cada dos instancias de estructura se consideran idénticas si se comparan iguales.
En conjunto, estos rasgos que diferencian las estructuras de las clases son lo que hace que las estructuras valoren los tipos.
Mutando un Struct
Un método de una estructura que cambie el valor de la estructura en sí debe tener un prefijo con la palabra clave que mutating
struct Counter {
private var value = 0
mutating func next() {
value += 1
}
}
Cuando puedes usar métodos de mutación
Los métodos de mutating
solo están disponibles en valores de estructura dentro de variables.
var counter = Counter()
counter.next()
Cuando NO puedes usar métodos de mutación
Por otro lado, los métodos de mutating
NO están disponibles en valores de estructura dentro de constantes
let counter = Counter()
counter.next()
// error: cannot use mutating member on immutable value: 'counter' is a 'let' constant
Las estructuras no pueden heredar
A diferencia de las clases, las estructuras no pueden heredar:
class MyView: NSView { } // works
struct MyInt: Int { } // error: inheritance from non-protocol type 'Int'
Las estructuras, sin embargo, pueden adoptar protocolos:
struct Vector: Hashable { ... } // works
Accediendo miembros de struct
En Swift, las estructuras usan una simple "sintaxis de puntos" para acceder a sus miembros.
Por ejemplo:
struct DeliveryRange {
var range: Double
let center: Location
}
let storeLocation = Location(latitude: 44.9871,
longitude: -93.2758)
var pizzaRange = DeliveryRange(range: 200,
center: storeLocation)
Puede acceder (imprimir) el rango de esta manera:
print(pizzaRange.range) // 200
Incluso puede acceder a miembros de miembros usando la sintaxis de puntos:
print(pizzaRange.center.latitude) // 44.9871
De manera similar a cómo puedes leer valores con sintaxis de puntos, también puedes asignarlos.
pizzaRange.range = 250