Recherche…


Bases de Structs

struct Repository {
    let identifier: Int
    let name: String
    var description: String?
}

Cela définit une structure de Repository avec trois propriétés stockées, un identifier entier, un name chaîne et une description chaîne facultative. L' identifier et le name sont des constantes, car ils ont été déclarés en utilisant le mot let clé let . Une fois définies lors de l'initialisation, elles ne peuvent plus être modifiées. La description est une variable. La modifier met à jour la valeur de la structure.

Les types de structure reçoivent automatiquement un initialiseur membre s'ils ne définissent aucun de leurs initialiseurs personnalisés. La structure reçoit un initialiseur membre, même si des propriétés stockées ne sont pas définies par défaut.

Repository contient trois propriétés stockées dont seule la description a une valeur par défaut ( nil ). De plus, il ne définit aucun initialiseur, il reçoit donc un initialiseur membre par code:

let newRepository = Repository(identifier: 0, name: "New Repository", description: "Brand New Repository")

Les structures sont des types de valeur

Contrairement aux classes, qui sont transmises par référence, les structures sont transmises via la copie:

first = "Hello"
second = first
first += " World!"
// first == "Hello World!"
// second == "Hello"

String est une structure, elle est donc copiée lors de l'affectation.

Les structures ne peuvent pas non plus être comparées à l'aide de l'opérateur d'identité:

window0 === window1 // works because a window is a class instance
"hello" === "hello" // error: binary operator '===' cannot be applied to two 'String' operands

Toutes les deux instances de structure sont réputées identiques si elles sont égales.

Collectivement, ces traits qui différencient les structures des classes sont ce qui fait que les types de valeur des structures.

Mutant d'une structure

Une méthode d'une structure qui modifie la valeur de la structure doit être préfixée avec le mot-clé en mutating

struct Counter {
    private var value = 0
    
    mutating func next() {
        value += 1
    }
}

Lorsque vous pouvez utiliser des méthodes de mutation

Les méthodes de mutating ne sont disponibles que sur les valeurs struct à l'intérieur des variables.

var counter = Counter()
counter.next()

Lorsque vous ne pouvez PAS utiliser de méthodes de mutation

D'un autre côté, les méthodes de mutating NE sont PAS disponibles sur les valeurs de structure à l'intérieur des constantes.

let counter = Counter()
counter.next()
//  error: cannot use mutating member on immutable value: 'counter' is a 'let' constant

Les structures ne peuvent pas hériter

Contrairement aux classes, les structures ne peuvent pas hériter:

class MyView: NSView { }  // works

struct MyInt: Int { } // error: inheritance from non-protocol type 'Int'

Les structures peuvent toutefois adopter des protocoles:

struct Vector: Hashable { ... }  // works

Accéder aux membres de struct

Dans Swift, les structures utilisent une simple «syntaxe à points» pour accéder à leurs membres.

Par exemple:

struct DeliveryRange {
  var range: Double
  let center: Location
}
let storeLocation = Location(latitude: 44.9871,
                             longitude: -93.2758)
var pizzaRange = DeliveryRange(range: 200,
                               center: storeLocation)

Vous pouvez accéder à (imprimer) la plage comme ceci:

    print(pizzaRange.range) // 200

Vous pouvez même accéder aux membres de membres en utilisant la syntaxe à point:

 print(pizzaRange.center.latitude) // 44.9871

De la même manière que vous pouvez lire des valeurs avec une syntaxe à point, vous pouvez également les affecter.

pizzaRange.range = 250


Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow