120 votes

Comment lancer un objet en Objective-C

Est-il un moyen de jeter des objets en objective-c un peu comme la façon dont les objets sont jetés dans VB.NET?

Par exemple, je suis en train de faire ce qui suit:

// create the view controller for the selected item
FieldEditViewController *myEditController;
switch (selectedItemTypeID) {
    case 3:
        myEditController = [[SelectionListViewController alloc] init];
        myEditController.list = listOfItems;
        break;
    case 4:
        // set myEditController to a diff view controller
        break;
}

// load the view
[self.navigationController pushViewController:myEditController animated:YES];
[myEditController release];

Cependant j'obtiens une erreur du compilateur depuis la "liste" de la propriété existe dans le SelectionListViewController classe mais pas sur le FieldEditViewController même si SelectionListViewController hérite de FieldEditViewController.

Cela fait sens, mais est-il un moyen de jeter myEditController à un SelectionListViewController afin que je puisse accéder à la "liste" de la propriété?

Par exemple, dans VB.NET je voudrais faire:

CType(myEditController, SelectionListViewController).list = listOfItems

Merci pour l'aide!

210voto

Jim Puls Points 29289

N'oubliez pas qu'Objective-C est un sur-ensemble de C, la conversion de typage fonctionne donc comme dans C:

 myEditController = [[SelectionListViewController alloc] init];
((SelectionListViewController *)myEditController).list = listOfItems;
 

11voto

Sijmen Mulder Points 1935
 ((SelectionListViewController *)myEditController).list
 

Plus d'exemples:

 int i = (int)19.5f; // (precision is lost)
id someObject = [NSMutableArray new]; // you don't need to cast id explicitly
 

4voto

Andrew Grant Points 35305

Bien sûr, la syntaxe est exactement la même que C - NewObj* pNew = (NewObj*)oldObj;

Dans cette situation, vous pouvez envisager de fournir cette liste en tant que paramètre au constructeur, à savoir:

 // SelectionListViewController
-(id) initWith:(SomeListClass*)anItemList
{
  self = [super init];

  if ( self ) {
    [self setList: anItemList];
  }

  return self;
}
 

Ensuite, utilisez-le comme ceci:

 myEditController = [[SelectionListViewController alloc] initWith: listOfItems];
 

0voto

stephen Points 517

Casting pour l’inclusion est tout aussi important que la coulée d’exclusion pour un programmeur C++. Le cast de type n’est pas la même que pour RTTI en ce sens que vous pouvez convertir un objet en n’importe quel type et le pointeur résultant ne sera pas nul.

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