Je peux voir ces définitions dans la bibliothèque Swift:
extension Bool : BooleanLiteralConvertible {
static func convertFromBooleanLiteral(value: Bool) -> Bool
}
protocol BooleanLiteralConvertible {
typealias BooleanLiteralType
class func convertFromBooleanLiteral(value: BooleanLiteralType) -> Self
}
Quelle est la différence entre une fonction membre définie comme static func
et une autre définie comme class func
? Est-ce simplement static
pour les fonctions statiques des structures et des énumérations, ainsi que class
pour les classes et les protocoles? Y a-t-il d'autres différences que l'on devrait connaître? Quelle est la justification de cette distinction dans la syntaxe elle-même?
class func
? Avec les informations dont nous disposons actuellement, cette distinction semble plutôt inutile, non?class func
serror: class methods are only allowed within classes; use 'static' to declare a static method
Réponses:
Voilà la principale différence. Certaines autres différences sont que les fonctions de classe sont distribuées dynamiquement et peuvent être remplacées par des sous-classes.
Les protocoles utilisent le mot-clé class, mais il n'exclut pas les structures de l'implémentation du protocole, ils utilisent simplement statique à la place. La classe a été choisie pour les protocoles, il n'y aurait donc pas besoin d'un troisième mot-clé pour représenter statique ou classe.
De Chris Lattner sur ce sujet:
Et voici un extrait qui montre certains des comportements de substitution des fonctions de classe:
la source
static func myFunc()
place declass func myFunc
vous obtiendrez l'erreur suivante l: ne peut pas remplacer la méthode statique . Pourquoi? Parce que c'est comme si c'était marquéfinal
. Pour plus d'informations. Voir la réponse de nextD ci-dessous. A égalementx.dynamicType
été remplacé partype(of:x)
Pour être plus clair, je fais un exemple ici,
static func
est identique àfinal class func
Parce qu'il l'est
final
, nous ne pouvons pas le remplacer dans la sous-classe comme ci-dessous:la source
class func
est différent de la normale,func
bien que les deux puissent être remplacées. Maisfunc
c'est pour une instance / un objet etclass func
peut être accessible via la classe commeClassA.classFunc()
J'ai fait quelques expériences dans une aire de jeux et j'ai tiré quelques conclusions.
TL; DR
Comme vous pouvez le voir, dans le cas de
class
, l'utilisationclass func
oustatic func
n'est qu'une question d'habitude.Exemple de terrain de jeu avec explication:
la source
class
fonctions vs liaison statique destatic
celles-ci.class func
remplaçable?class func
est remplaçable. J'aurais voté cela autrement; j'adore la recherche et l'exemple!Source: langage de programmation Swift - Propriétés des variables de type
la source
Selon le livre Swift 2.2 publié par apple:
«Vous indiquez des méthodes de type en écrivant le
static
mot - clé avant le mot-clé func de la méthode. Les classes peuvent également utiliser leclass
mot clé pour permettre aux sous-classes de remplacer l'implémentation de cette méthode par la superclasse . »la source
Depuis Swift2.0, Apple dit:
"Toujours préfixer les exigences de propriété de type avec le mot clé statique lorsque vous les définissez dans un protocole. Cette règle s'applique même si les exigences de propriété de type peuvent être préfixées avec la classe ou le mot clé statique lorsqu'ils sont implémentés par une classe:"
la source
Cet exemple effacera tous les aspects!
Production:
la source
C'est ce qu'on appelle les méthodes de type et elles sont appelées avec la syntaxe à points, comme les méthodes d'instance. Cependant, vous appelez des méthodes de type sur le type, pas sur une instance de ce type. Voici comment appeler une méthode de type sur une classe appelée SomeClass:
la source
static
etclass
.