wake-up-neo.com

Wann werden statische Konstante und Variable in Swift verwendet?

Es gibt einige Beiträge zum Schreiben von Code für static constant und static variable in Swift. Es ist jedoch nicht klar, wann static constant und static variable anstelle von constant und variable verwendet werden soll. Kann jemand das erklären?

23
Mike

Wenn Sie eine statische Variable in einer Klasse (oder Struktur) definieren, werden diese Informationen von allen Instanzen (oder Werten) gemeinsam verwendet.

Informationen teilen

class Animal {
    static var nums = 0

    init() {
        Animal.nums += 1
    }
}

let dog = Animal()
Animal.nums // 1
let cat = Animal()
Animal.nums // 2

Wie Sie hier sehen können, habe ich zwei separate Instanzen von Animal erstellt, aber beide verwenden dieselbe statische Variable nums.

Singleton

Oft wird eine statische Konstante verwendet, um das Singleton-Muster zu übernehmen. In diesem Fall soll nicht mehr als 1 Instanz einer Klasse zugewiesen werden .. Dazu speichern wir den Verweis auf die gemeinsam genutzte Instanz innerhalb einer Konstante und verstecken den Initialisierer.

class Singleton {
    static let sharedInstance = Singleton()

    private init() { }

    func doSomething() { }
}

Wenn wir nun die Singleton-Instanz brauchen, schreiben wir

Singleton.sharedInstance.doSomething()
Singleton.sharedInstance.doSomething()
Singleton.sharedInstance.doSomething()

Dieser Ansatz erlaubt es uns, immer die gleiche Instanz zu verwenden, auch an verschiedenen Stellen der App.

61
Luca Angeletti

Es gibt einige Beiträge zum Schreiben von Code für statische konstante und statische Variablen in Swift. Es ist jedoch nicht klar, wann statische konstante und statische Variable anstelle von konstant und variabel verwendet werden sollen. Kann jemand erklären? Wenn Sie ein statisches var/let in einer Klasse (oder Struktur) definieren, wird dieser Wert von allen Instanzen (oder Werten) gemeinsam genutzt.

statische Variablen/Klasse sind Variablen, auf die zugegriffen werden kann, ohne dass eine Instanz/ein Objekt erstellt werden muss.

class Human {
    static let numberOfEyes = 2 //human have only 2 eyes
    static var eyeDefect = false //whether human have side-effect or not. he can have defect later so its variable

    //other variables and functions
}

//you can access numberOfEyes like below no object of Human is created
print(Human.numberOfEyes)
print(Human.eyeDefect)

//Object of Human
let john = Human()

Ich denke, Sie kennen den Unterschied zwischen konstant und variabel. Kurz gesagt, konstant ist das, dessen Wert sich niemals ändert; numberOfEyes im obigen Beispiel und Variable ist das, dessen Wert sich ändert; eyeDefect im obigen Beispiel.

statische Konstante oder Variablen werden getrennt von den Objekten in den Arbeitsspeicher (RAM) gestellt. Das heißt, numberOfEyes verfügt über einen anderen Speicherplatz als das John-Objekt, nicht aber in John.

jetzt, wann statische Konstanten/Variablen verwendet werden sollen:

  1. Bei Verwendung eines Singleton-Entwurfsmusters: static let sharedInstance = APIManager ()

    class APIManager(){
        static let sharedInstance = APIManager()
        //Your other variables/functions here below
    }
    //Use it as to get singleton instance of APIManager from anywhere in your application
    let instanceOfAPIManager = APIManager.sharedInstance
    
  2. Wenn Sie einen Wert für alles benötigen, der global gleich ist, ohne eine Instanz der Klasse erstellen zu müssen, unter der er wie numberOfEyes in human class definiert ist.

  3. Die Verwendung statischer Variablen/Konstanten wird aufgrund von Speicherproblemen nicht besonders empfohlen, da sie nach ihrer Instanziierung/Zuweisung im Speicher verbleibt, bis Ihre Anwendung aus dem Speicher entfernt wird. Ich habe bis jetzt herausgefunden, dass der beste Platz für statische Variablen/Konstanten nur beim Erstellen von Singleton-Mustern und manchmal Zeigern für andere normale Variablen und Konstanten ist, die statisch nicht verwendet werden, da: Speicherprobleme die Ausführung von Unit-Tests in Ihrem Code schwierig machen mit statischen Variablen/Konstanten. Nicht zu empfehlen, wie in der Human-Klasse zu verwenden. Verwenden Sie sie stattdessen als Konstante oder Variable und greifen Sie auf sie zu, indem Sie Instanz erstellen.

    class Human {
     let numberOfEyes = 2 //human have only 2 eyes
     var eyeDefect = false //whether human have side-effect or not. he can have defect later so its variable
    
       //other variables and functions
     }
    
    //you can access numberOfEyes like below if you need just those values.
    print(Human().numberOfEyes)
    print(Human().eyeDefect)
    
9
Dari

Statische Konstanten und Variablen gehören zur Klasse selbst, nicht zu einer bestimmten Instanz. Eine Klasse kann auch über statische Methoden verfügen, die aufgerufen werden können, ohne eine Instanz einer Klasse zu erstellen.

Wenn Sie also eine Klasse MyClass mit einer statischen var x haben, können Sie auch direkt über MyClass.x darauf zugreifen. x wird von allen Instanzen einer Klasse gemeinsam genutzt

3
Julia Will

Dies ist eher ein wichtiger Kommentar: 

class Person {
    static var name = "Static John" // a property of Person 'type'
    var name = "Alex" // a property of Person 'instance'

    var nonStaticName = "Peter"
    static var staticName = "Sara"



    static func statFunc() {
        let x = Person.name // Static John
        let y = name // Static John or Alex?!  Static John!!!!
        let r = staticName // Sara
        let k = nonStaticName // ERROR: instance member 'nonStaticName' cannot be used on type 'Person'
        // The compiler is like: I'm referrting to the `nonStaticName` property of which instance?! There is no instance! Sorry can't do!

    }

    func nonStaticFunc() {
        let x = Person.name // Static John
        let y = name // Static John or Alex?! Alex!!! Because we're in a instance scope...
        let k = nonStaticName // Obviously works
        let r = staticName // ERROR: static member 'staticName' cannot be used on instance of type 'Person'. Person.staticName will work
    }
}

Interessante Beobachtungen: 

Zuerst:

static var name = "Static John" // a property of Person 'type'
var name = "Alex" // a property of Person 'instance'

schafft keine Konflikte 

Zweite:

In statischen Variablen können Sie niemals Instanzvariablen verwenden. Sie können statische Variablen innerhalb von Instanzfunktionen verwenden wenn Sie darauf verweisen, indem Sie dem Typ den Präfix voranstellen, dh do Person.name, während

auf statische Variablen kann auf in static Funktionen mit oder ohne Präfix des Typs zugegriffen werden, dh Person.staticName oder staticName beide funktionieren. 

0
Honey