Le code suivant se compile 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 ? Laquelle dois-je utiliser et quand?
Si j'essaie de définir une autre variable class var myVar2 = ""
, elle dit:
Propriétés stockées de classe non encore prises en charge dans les classes; vouliez-vous dire «statique»?
Lorsque cette fonctionnalité est prise en charge, quelle sera la différence entre une variable statique et une variable de classe (c'est-à-dire lorsque les deux sont définies dans une classe)? Laquelle dois-je utiliser et quand?
(Xcode 6.3)
Réponses:
static
et lesclass
deux associent une méthode à une classe, plutôt qu'une instance d'une classe. La différence est que les sous-classes peuvent remplacer lesclass
méthodes; ils ne peuvent pas remplacer lesstatic
méthodes.class
Les propriétés fonctionneront théoriquement de la même manière (les sous-classes peuvent les remplacer), mais elles ne sont pas encore possibles dans Swift.la source
final class
fonction et la fonction «statique» au sein d'une classe?final
peut être utilisé pour supprimer d'autres remplacements lorsqu'il est utilisé dans une sous-classe. Les deux ont leur place, je dirais que l'utilisationstatic
oufinal
lorsqu'elle est utilisée sur une fonction de classe est triviale et dépend de votre choix de style.static func foo(){}
dans Swift, c'est commepublic static final foo(){}
dans Java?J'ai essayé la réponse et les commentaires de mipadi sur le terrain de jeu. Et j'ai pensé à le partager. Voici. Je pense que la réponse de mipadi devrait être considérée comme acceptée.
la source
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
class var myVar2 = ""
), vous devez le faire comme suit:la source
J'ai également eu cette confusion dans l'un de mes projets et j'ai trouvé ce message très utile. J'ai essayé la même chose dans ma cour de récréation et voici le résumé. Espérons que cela aide quelqu'un avec des propriétés stockées et fonctions de type
static
,final
,class
, classe remplaçant vars etc.Et voici les échantillons de test:
la source
Les tests dans Swift 4 montrent la différence de performances dans le simulateur. J'ai fait une classe avec "class func" et struct avec "static func" et les ai exécutés en test.
la fonction statique est:
Cependant, l'exécution du même code sur iPhone 7 sous iOS 10.3 affiche exactement les mêmes performances.
Voici un exemple de projet dans Swift 4 pour Xcode 9 si vous souhaitez vous tester vous-même https://github.com/protyagov/StructVsClassPerformance
la source
Il y a encore une différence.
class
peut être utilisé pour définir des propriétés de type de type calculé uniquement . Si vous avez besoin d'une propriété de type stockée, utilisezstatic
plutôt."Vous définissez les propriétés de type avec le mot clé statique. Pour les propriétés de type calculées pour les types de classe, vous pouvez utiliser le mot clé class à la place pour permettre aux sous-classes de remplacer l'implémentation de la superclasse."
la source
Ajouter aux réponses ci-dessus les méthodes statiques sont une répartition statique signifie que le compilateur sait quelle méthode sera exécutée au moment de l'exécution car la méthode statique ne peut pas être remplacée tandis que la méthode de classe peut être une répartition dynamique car la sous-classe peut les remplacer.
la source
Il y a encore une différence. La classe peut être utilisée pour définir les propriétés de type du type calculé uniquement. Si vous avez besoin d'une propriété de type stockée, utilisez plutôt static.
Classe: - type de référence
struct: - type de valeur
la source
class
est utilisé à l'intérieurReference Type
(classe):static
est utilisé à l'intérieurReference Type
etValue Type
(classe, énum):[Référence vs type de valeur]
la source