Fonctions statiques vs classes / variables dans les classes Swift?

Le code suivant comstack dans Swift 1.2:

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

Quelle est la différence entre une fonction statique et une fonction de classe ? Lequel dois-je utiliser et quand?

Si j’essaie de définir une autre class var myVar2 = "" variables class var myVar2 = "" , cela dit:

Propriétés stockées dans la classe non encore sockets en charge dans les classes; Voulez-vous dire “statique”?

Lorsque cette fonctionnalité est prise en charge, quelle sera la différence entre une variable statique et une variable de classe (par exemple, lorsque les deux sont définies dans une classe)? Lequel dois-je utiliser et quand?

(Xcode 6.3)

static et class associent une méthode à une classe plutôt qu’une instance d’une classe. La différence est que les sous-classes peuvent remplacer class méthodes de class ; ils ne peuvent pas remplacer static méthodes static .

class propriétés de class fonctionneront théoriquement de la même manière (les sous-classes peuvent les remplacer), mais elles ne sont pas encore possibles dans Swift.

J’ai essayé la réponse de mipadi et les commentaires sur le terrain de jeux. Et pensé à le partager. Voici. Je pense que la réponse de mipadi devrait être considérée comme acceptée.

 class A{ class func classFunction(){ } static func staticFunction(){ } class func classFunctionToBeMakeFinalInImmediateSubclass(){ } } class B: A { override class func classFunction(){ } //Comstack Error. Class method overrides a 'final' class method override static func staticFunction(){ } //Lets 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{ //Comstack Error. Class method overrides a 'final' class method override static func classFunctionToBeMakeFinalInImmediateSubclass(){ } } 

En ce qui concerne la POO , la réponse est trop simple:

Les sous-classes peuvent remplacer les méthodes de classe , mais ne peuvent pas remplacer les méthodes statiques .

En plus de votre message, si vous souhaitez déclarer une variable de classe (comme vous l’avez fait pour la class var myVar2 = "" ), vous devez le faire comme suit:

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

J’ai aussi eu cette confusion dans un de mes projets et j’ai trouvé cet article très utile. J’ai essayé le même dans mon terrain de jeu et voici le résumé. J’espère que cela aidera quelqu’un avec des propriétés stockées et des fonctions de type static , final , class , vars de classe de substitution, etc.

 class Simple { init() {print("init method called in base")} class func one() {print("class - one()")} class func two() {print("class - two()")} static func staticOne() {print("staticOne()")} static func staticTwo() {print("staticTwo()")} final func yesFinal() {print("yesFinal()")} static var myStaticVar = "static var in base" //Class stored properties not yet supported in classes; did you mean 'static'? class var myClassVar1 = "class var1" //This works fine class var myClassVar: Ssortingng { return "class var in base" } } class SubSimple: Simple { //Successful override override class func one() { print("subClass - one()") } //Successful override override class func two () { print("subClass - two()") } //Error: Class method overrides a 'final' class method override static func staticOne() { } //error: Instance method overrides a 'final' instance method override final func yesFinal() { } //Works fine override class var myClassVar: Ssortingng { return "class var in subclass" } } 

Et voici les échantillons de test:

 print(Simple.one()) print(Simple.two()) print(Simple.staticOne()) print(Simple.staticTwo()) print(Simple.yesFinal(Simple())) print(SubSimple.one()) print(Simple.myStaticVar) print(Simple.myClassVar) print(SubSimple.myClassVar) //Output class - one() class - two() staticOne() staticTwo() init method called in base (Function) subClass - one() static var in base class var in base class var in subclass 

Les tests dans Swift 4 montrent la différence de performance dans le simulateur. J’ai fait un cours avec “class func” et struct avec “static func” et je les ai lancés en test.

func statique est:

  • 20% plus rapide sans optimisation du compilateur
  • 38% plus rapide lorsque l’optimisation -bloss-module-optimisation est activée.

Cependant, l’exécution du même code sur l’iPhone 7 sous iOS 10.3 montre exactement les mêmes performances.

Voici un exemple de projet dans Swift 4 pour Xcode 9 si vous souhaitez vous tester https://github.com/protyagov/StructVsClassPerformance

Il y a une autre différence. class peut être utilisé pour définir les propriétés de type du type calculé uniquement . Si vous avez besoin d’une propriété de type stocké, utilisez plutôt static .

“Vous définissez les propriétés de type avec le mot-clé static. Pour les propriétés de type calculées pour les types de classe, vous pouvez utiliser le mot-clé class plutôt que d’autoriser les sous-classes à remplacer l’implémentation de la super-classe.”

Ajouter aux réponses ci-dessus des méthodes statiques comme la dissortingbution statique signifie que le compilateur sait quelle méthode sera exécutée à l’exécution car la méthode statique ne peut pas être remplacée alors que la méthode de classe peut être une dissortingbution dynamic car la sous-classe peut les remplacer.