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


Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow