IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Objective-C Discussion :

Question sur les déclarations statiques de types [Objective-C]


Sujet :

Objective-C

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 31
    Points : 30
    Points
    30
    Par défaut Question sur les déclarations statiques de types
    Bonjour,

    Je rencontre parfois dans des exemples de programmes proposés par Apple des codes de ce genre:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    RootViewController *rootViewController = (RootViewController *)[navigationController topViewController];
    où la classe "RootViewController" est une classe spécifique qui hérite de UITableViewController et l'objet navigationController est une instance de la classe UINavigationController.

    Je ne comprends pas à quoi correspond la déclaration "(RootViewController *)" située juste après l'opérande " = ".

    S'agit-il d'une déclaration qui "force" le résultat du message envoyé à "navigationController" pour que ce résultat soit une instance de la classe "RootViewController" au lieu d'être une instance de "UIViewController"? Le cas échéant, je ne comprends pas très bien l'intérêt: si le topViewController de n'est pas une instance de RootViewController, qu'est ce que le runtime va bien pouvoir faire?...

    S'agit-il d'un test de conformité de type avant affectation au pointeur *rootViewController? Mais je pensais que ce type de test était de toute façon réalisé lors de l'affectation, non?

    S'agit-il uniquement d'une information à destination du compilateur pour qu'il n'émette pas d'avertissement lors de la compilation du code (sur l'éventuelle différence de type)?

    J'ai beau googlisé, passer en revue toute FAQ qui me tombe sous la main, et me refaire moultes passes sur la doc Apple, je ne trouve pas d'explications sur ce sujet... Si qqun peut éclairer ma lanterne, je suis (très) preneur... Merci d'avance pour toute aide!

    Olive

  2. #2
    Membre éprouvé Avatar de Ragmaxone
    Homme Profil pro
    Responsable systèmes de distribution
    Inscrit en
    Août 2007
    Messages
    441
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Pologne

    Informations professionnelles :
    Activité : Responsable systèmes de distribution

    Informations forums :
    Inscription : Août 2007
    Messages : 441
    Points : 1 001
    Points
    1 001
    Par défaut
    si j'ai bien compris c'est un "cast".

    en gros l'objet obtenu avec "[navigationController topViewController]" n'est pas de type RootViewController et donc il ne peut pas être assigné à rootViewController sans le "transformer".

    c'est comme si tu avais fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int32 nombre = (int32)monInt16;

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 31
    Points : 30
    Points
    30
    Par défaut Merci pour la réponse
    OK. Et bien je ne savais pas que des casts de ce type pouvaient être faits: je pensais que les casts se limitaient aux objets de type int, float, etc. mais je ne pensais pas qu'ils pouvaient se faire sur des objets "hors C"... Je retourne à la doc Apple!...

    Un grand merci en tout cas pour cet éclaircissement Ragmaxone!...

    Olive

  4. #4
    Membre éprouvé Avatar de Ragmaxone
    Homme Profil pro
    Responsable systèmes de distribution
    Inscrit en
    Août 2007
    Messages
    441
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Pologne

    Informations professionnelles :
    Activité : Responsable systèmes de distribution

    Informations forums :
    Inscription : Août 2007
    Messages : 441
    Points : 1 001
    Points
    1 001
    Par défaut
    "si j'ai bien compris", donc je suis pas sûr à 100% mais c'est ce qui semble le plus logique et je l'ai déjà rencontré dans d'autres langages (de sûr C#). pour des classes très proches ou dans la même branche ça pose pas de problèmes.

    corrigez moi si je me trompe

  5. #5
    Membre expérimenté Avatar de Ceylo
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2007
    Messages
    1 216
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 216
    Points : 1 312
    Points
    1 312
    Par défaut
    Le cast (ou transtypage en français) ne pose pas de problème tant que la classe d'arrivée est une classe parent de celle de départ.

    Cela est dû au fait que la classe parent a au moins les mêmes méthodes que la classe fille, et c'est ce qui est utilisé par la suite.

  6. #6
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 937
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 937
    Points : 4 358
    Points
    4 358
    Par défaut
    Citation Envoyé par Spootnik Voir le message
    Le cast (ou transtypage en français) ne pose pas de problème tant que la classe d'arrivée est une classe parent de celle de départ.

    Cela est dû au fait que la classe parent a au moins les mêmes méthodes que la classe fille, et c'est ce qui est utilisé par la suite.
    c'est de l'Objective-C pas du C++…
    ce que vous dites est évidemment juste… mais restrictif… et pas dans l'esprit Objective-C…

    le cast de classe en Objective-C permet d'éviter les warnings du compilateur…

    mais même si les 2 classes n'ont strictement aucun rapport hiérarchique, il n'y aura en fait de problème que si l'on invoque des méthodes qui ne sont pas implémentées…

    par exemple, NSHTTPCookie et NSLock n'ont aucun rapport hiérarchique entre elles…
    mais implémentent toutes les deux le message "- (NSString *)name"…
    si vous assignez à un NSLock une variable NSHTTPCookie avec un cast pour faire taire le compilateur et appelez ensuite "name"… çà fonctionnera très bien…
    (n'essayez pas çà en C++… )

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    NSLock *lock= (NSLock *)aHTTPCookie ; // cast "idiot" … mais cela fera taire le compilateur…
    NSLog(@"%@",[lock name]) ; // invoquera en réalité "name" de NSHTTPCookie…
    (… et çà fonctionnera aussi très bien même si les 2 messages retournent un objet de type différent… )

    en fait… vous pourriez mettre "id" partout au lieu de "Class *"…
    mais çà noierait les quelques warnings intéressants dans un flot d'inutiles…

    d'autre part, en Objective-C vous pouvez aussi faire des cast liés aux protocoles… (tjs pour éviter les warnings du compilateur…)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    id<AProtocol> anObject = (id<AProtocol>)anotherObject;

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 31
    Points : 30
    Points
    30
    Par défaut So...
    OK... Donc en fait ce "cast" (mais, du coup, je ne trouve pas le terme très adapté) est uniquement là pour lever les alertes au niveau de la compilation - en lui indiquant par là que nous avons totale confiance dans la cohérence de type au moment du runtime... Je vois plus clair avec ça et je comprends mieux maintenant certains codes objective-C que j'ai pu lire ici et là...

    Je ne sais pas si j'ai mal consulté le contenu des documentations Apple mais je n'ai pas réussi à trouver d'informations sur ce type de syntaxe de langage. Faudra que je me lise un bouquin spécifiquement sur l'objective-C à l'occas!...

    Merci en tout cas pour ces éclaircissements!

    O.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. question sur les méthodes statique
    Par yacin87 dans le forum Débuter avec Java
    Réponses: 2
    Dernier message: 14/04/2010, 10h32
  2. Réponses: 7
    Dernier message: 09/05/2007, 19h35
  3. petite question sur les types de champs
    Par charlie koller dans le forum Débuter
    Réponses: 2
    Dernier message: 21/02/2007, 17h57
  4. Questions sur les types énumérés
    Par Premium dans le forum Langage
    Réponses: 5
    Dernier message: 12/11/2006, 18h00
  5. [SQL 2000] Question sur les types de données
    Par Angath dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 03/11/2006, 14h05

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo