2 votes

Signature de la fonction Swift type(of :)

J'essaie d'implémenter une fonction qui renvoie le nom simple du type de valeur :

func typeName(of value: Any) -> String {
    return String(describing: type(of:value))
}

Mais quand j'essaie de l'appeler avant super.init appeler :

class SuperTest {
    init(name: String) {
        print(name)
    }
}

class Test: SuperTest {
    init() {
//        super.init(name: String(describing: type(of: self)))
        super.init(name: typeName(of: self))
    }
}

Test()

il échoue avec :

'self' utilisé avant l'appel à super.init

ce qui est totalement clair pour moi.

Mais quand je mets en ligne typeName(of:) (ligne commentée) puis il compile et imprime le résultat "Test" attendu.

Pourquoi cette magie se produit-elle et comment puis-je utiliser typeName(of:) antes de super.init() comme type(of:) ?

Je ne peux pas non plus trouver d'informations (signature de fonction) sur type(of:) dans Swift docs o code source .

3voto

Sven Points 13090

Même si ça ressemble à ça type(of:) n'est pas une fonction, elle est traitée statiquement par le compilateur comme une fonction Expression dynamique de type . Pour cette raison, vous pouvez l'utiliser avant d'appeler super.init.

Avec votre fonction personnalisée, le compilateur ne sait pas que vous n'utilisez pas réellement la valeur et il ne peut donc pas autoriser l'appel.

1voto

matt Points 60113

Je ne peux pas non plus trouver d'informations (signature de fonction) sur type(of:)

Parce que ce n'est pas une fonction définie par la bibliothèque standard. Il s'agit d'une primitif c'est-à-dire qu'il fait partie de la langue. Comme l'exprimaient les notes de version originales :

une nouvelle fonction primitive type(of:) a été ajouté à la langue [souligné par moi]

On pourrait presque le considérer comme un opérateur. (C'est d'ailleurs tout l'intérêt de sa création, comme le suggérait l'article d'origine intitulé proposition .)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X