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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 31
    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 très actif 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 : 40
    Localisation : Pologne

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

    Informations forums :
    Inscription : Août 2007
    Messages : 441
    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
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 31
    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 très actif 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 : 40
    Localisation : Pologne

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

    Informations forums :
    Inscription : Août 2007
    Messages : 441
    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 émérite Avatar de Ceylo
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2007
    Messages
    1 216
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 216
    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
    Membre Expert
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 963
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 963
    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;

+ 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