web-dev-qa-db-fra.com

Swift Declare Class Func in Protocol

J'ai eu la confusion suivante. Autant que je sache, la principale différence entre les mots-clés statique et classe lors de la déclaration de la méthode est que le second pourrait être remplacé dans les sous-classes.

Le problème

Cependant, lorsque je déclare un protocole en Swift 1.2 comme ceci:

protocol MyProtocol
{
    class func dummyClassMethod()
}

le compilateur donne une erreur:

Les méthodes de classe ne sont autorisées que dans les classes; utiliser 'statique' pour déclarer une méthode statique

L'erreur est assez descriptive car évidemment MyProtocol n'est pas une classe, cependant je veux faire une partie func de classe du protocole.

Ce que j'ai essayé

J'ai trouvé que si je déclare l'interface dans le protocole comme statique, le compilateur est content et je pourrais utiliser cette méthode statique dans toutes les classes qui adoptent ce protocole:

protocol MyProtocol
{
    static func dummyClassMethod()
}

La question

Donc, ma question est essentiellement est-ce vrai? Cette déclaration indique que ma méthode de classe ne peut pas être remplacée chez les enfants, mais dans mon implémentation, je pourrais écrire et utiliser ce qui suit:

class ClassA: MyProtocol
{
    class func dummyClassMethod() {

    }
}

class ClassB: ClassA
{
    override class func dummyClassMethod() {

    }
}

et maintenant mon dummyClassMethod n'est plus statique ...

  1. Le compilateur est Ok et tout fonctionne - mais pourquoi?

  2. Est-ce spécifique au fait que l'interface elle-même est statique, contrairement à sa mise en œuvre?

  3. Existe-t-il une meilleure alternative pour les fonctions de classe dans les protocoles?

solution Objective-C

Dans ObjC, c'est assez facile et compilez et exécutez parfaitement:

@protocol MyProtocol 

+(void)dummyClassMethod;

@end
30
hris.to

Vous pouvez consulter Documentation d'Apple (sous-section Exigences de la méthode).

Il dit:

Comme pour les exigences de propriété de type, vous préfixez toujours les exigences de méthode de type avec le mot clé statique lorsqu'elles sont définies dans un protocole. Cela est vrai même si les exigences de méthode de type sont préfixées avec la classe ou statique mot clé lorsqu'il est implémenté par une classe

En pratique, vous pouvez le faire comme suit:

Tout d'abord, déclarez votre protocole:

protocol SomeProtocol {
    static func someMethod()
}

Ensuite, dans votre class vous avez 2 options:

Premier:

class SomeClass : SomeProtocol {
    class func someMethod()
}

Deuxième:

class SomeClass : SomeProtocol {
    static func someMethod()
}

J'espère que cela clarifiera votre doute ..

30
eMdOS

https://developer.Apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Protocols.html

Un protocole définit un schéma de méthodes, de propriétés et d'autres exigences qui conviennent à une tâche ou à un élément de fonctionnalité particulier. Le protocole ne fournit en fait une implémentation pour aucune de ces exigences - il décrit uniquement à quoi ressemblera une implémentation. Le protocole peut ensuite être adopté par une classe, une structure ou une énumération pour fournir une implémentation réelle de ces exigences.

Après cette définition du protocole, il devient raisonnable que

Comme pour les exigences de propriété de type, vous préfixez toujours les exigences de méthode de type avec le mot clé statique lorsqu'elles sont définies dans un protocole. Cela est vrai même si les exigences de méthode de type sont préfixées avec la classe ou le mot clé statique lorsqu'elles sont implémentées par une classe ...

2
ilya

Pour rendre la méthode de protocole statique et implémenter cette méthode avec un mot clé statique

class ClassA: MyProtocol{

    static func dummyClassMethod() {

    }
} 

et maintenant vous ne pouvez plus remplacer la fonction dummyClassMethod. Si vous souhaitez empêcher la substitution uniquement, vous devez déclarer la méthode de protocole comme définitive. À propos des fonctions de classe, elles n'étaient pas entièrement prises en charge dans Swift 1.0 et maintenant dans Swift 1.2 Je pense qu'elles évoluent vers des fonctions statiques)

1
Zell B.