Statische versus klassefuncties/variabelen in Swift-klassen?

De volgende code wordt gecompileerd in Swift 1.2:

class myClass {
    static func myMethod1() {
    }
    class func myMethod2() {
    }
    static var myVar1 = ""
}
func doSomething() {
    myClass.myMethod1()
    myClass.myMethod2()
    myClass.myVar1 = "abc"
}

Wat is het verschil tussen een statischefunctie en een classfunctie? Welke moet ik gebruiken en wanneer?

Als ik een andere variabele probeer te definiëren class var myVar2 = "", staat er:

Opgeslagen klasse-eigenschappen nog niet ondersteund in klassen; bedoelde je ‘statisch’?

Als deze functie wordt ondersteund, wat is dan het verschil tussen een statischevariabele en een klassevariabele (d.w.z. wanneer beide zijn gedefinieerd in een klasse)? Welke moet ik gebruiken en wanneer?

(Xcode 6.3)


Antwoord 1, autoriteit 100%

staticen classassociëren beide een methode met een klasse, in plaats van een instantie van een klasse. Het verschil is dat subklassen classmethoden kunnen overschrijven; ze kunnen staticmethoden niet overschrijven.

class-eigenschappen werken in theorie op dezelfde manier (subklassen kunnen ze overschrijven), maar ze zijn nog niet mogelijk in Swift.


Antwoord 2, autoriteit 10%

Ik heb mipadi’s antwoord en opmerkingen op de speelplaats geprobeerd. En dacht eraan om het te delen. Alsjeblieft. Ik denk dat mipadi’s antwoord moet worden gemarkeerd als geaccepteerd.

class A{
    class func classFunction(){
    }
    static func staticFunction(){
    }
    class func classFunctionToBeMakeFinalInImmediateSubclass(){
    }
}
class B: A {
    override class func classFunction(){
    }
    //Compile Error. Class method overrides a 'final' class method
    override static func staticFunction(){
    }
    //Let's avoid the function called 'classFunctionToBeMakeFinalInImmediateSubclass' being overriden by subclasses
    /* First way of doing it
    override static func classFunctionToBeMakeFinalInImmediateSubclass(){
    }
    */
    // Second way of doing the same
    override final class func classFunctionToBeMakeFinalInImmediateSubclass(){
    }
    //To use static or final class is choice of style.
    //As mipadi suggests I would use. static at super class. and final class to cut off further overrides by a subclass
}
class C: B{
    //Compile Error. Class method overrides a 'final' class method
    override static func classFunctionToBeMakeFinalInImmediateSubclass(){
    }
}

Antwoord 3, autoriteit 4%

Met betrekking tot OOPis het antwoord te simpel:

De subklassen kunnen klassenmethoden overschrijven, maar kunnen statischemethoden niet overschrijven.

Als je naast je bericht een variabele classwilt declareren (zoals je deed class var myVar2 = ""), moet je dat als volgt doen:

class var myVar2: String {
    return "whatever you want"
}

Antwoord 4, autoriteit 3%

Testen in Swift 4 toont prestatieverschil in simulator. Ik heb een klasse gemaakt met “class func” en struct met “static func” en heb ze getest.

statische functie is:

  • 20%sneller zonder compileroptimalisatie
  • 38%sneller wanneer optimalisatie -hele-module-optimalisatie is ingeschakeld.

Het uitvoeren van dezelfde code op iPhone 7 onder iOS 10.3 levert echter exact dezelfde prestaties op.

Hier is een voorbeeldproject in Swift 4 voor Xcode 9 als je jezelf wilt testen
https://github.com/protyagov/StructVsClassPerformance


5

Toevoegen aan bovenstaande antwoorden Statische methoden zijn statische verzending betekent dat de compiler weet welke methode op runtime zal worden uitgevoerd, omdat de statische methode niet kan worden overschreven, terwijl de klassenmethode een dynamische verzending kan zijn als subklasse deze.

Other episodes