Swift appel de méthodes statiques: type(de: auto) vs explicite nom de la classe
Dans swift, une instance func
ne pouvez pas appeler un static/class func
sans la préfixation de l'appel de méthode par le nom de la classe. OU vous pouvez utiliser type(of: self)
, e.g
class Foo {
static func doIt() { }
func callIt() {
Foo.doIt() //This works
type(of: self).doIt() //Or this
doIt() //This doesn't compile (unresolved identifier)
}
}
Ma question est, quelle est la différence ici?
Est-ce simplement une question de style de codage, ou est-il une différence, par exemple, statique ou dynamique, l'expédition se passe?
Si c'est juste le style de codage, ce qui est le style préféré?
- Je ne crois pas qu'il existe une répartition dynamique. Nous ne sommes pas en Objective-C monde car il n'y a pas de
@objc
,dynamic
, ouNSObject
héritage. - En fait Swift classe sont Obj-C classes sous le capot (au moins lors de l'Obj-C runtime est incluse). Et "pure" Swift n'avez répartition dynamique en trop (pensez protocoles) – ce n'est pas seulement un Obj-C chose.
- Je sais que Swift classes héritent de SwiftObject, mais est-il de même avec la solution open source d'exécution (à l'exclusion des protocoles)?
- Ouais, je viens de modifier mon commentaire à la note que je n'ai pas regardé l'open source, de l'exécution dans les détails, mais je ne crois pas que Swift classes sont basées sur l'Obj-C des classes, comme il n'y a pas l'Obj-C runtime.
- Suivre cette proposition pour apple pensées à ce sujet: github.com/apple/swift-evolution/blob/master/proposals/...
Vous devez vous connecter pour publier un commentaire.
Il y a deux différences principales.
1. La valeur de
self
à l'intérieur de la méthode statiqueLa metatype que vous appelez la méthode statique est disponible pour vous dans la méthode comme
self
(c'est tout simplement passé comme un paramètre implicite). Donc si vous appelezdoIt()
surtype(de: auto)
,self
sera le dynamique metatype de l'instance. Si vous l'appelez surFoo
,self
seraFoo.self
.Cette différence peut être vraiment important pour les méthodes de fabrique, car il détermine le type d'instance que vous créez.
2. L'appel de la méthode statique
(Martin a déjà couverts cela, mais j'ai pensé que je voudrais ajouter, pour le bien de l'achèvement.)
Pour
class
méthodes qui sont remplacées dans les sous-classes, la valeur de la metatype que vous appelez la méthode détermine la mise en œuvre d'appel.Si elle est appelée sur un metatype qui est connu au moment de la compilation (e.g
Foo.doIt()
), Swift est en mesure de statiquement l'envoi de l'appel. Toutefois, si vous appelez la méthode sur un metatype qui n'est pas connu jusqu'à l'exécution (e.gtype(of: self)
), l'appel de la méthode sera dynamiquement distribué à la mise en œuvre correcte de la metatype valeur.Pour un
class
méthode, cela fait une différence si la méthode estredéfinie dans une sous-classe:
C'est également documenté dans "Types" de la Swift de Référence du Langage:
je ne sais pas la différence pour unstatic
méthode (qui estfinal
et ne peut pas être redéfinie dans une sous-classe).
Correction: Voir Hamish réponse pour la différence
dans les deux statique et les méthodes de la classe.
static
etclass
méthodes est la valeur deself
à l'intérieur de la méthode, voir ma réponse 🙂