Proprio come ai tempi dei Java pre-generici, scrivo codice come questo:
UIView *ball = [self.balls objectAtIndex:i];
che provoca un avviso del compilatore. So che il modo corretto per risolverlo - ammesso che non esploda in fase di esecuzione - è usare
UIView *ball = (UIView *)[self.balls objectAtIndex:i];
ma recentemente ho preferito
UIView *ball = (id)[self.balls objectAtIndex:i];
C'è QUALCHE motivo per non farlo? Cambia qualcosa in fase di esecuzione? È più facile scrivere e leggere, credo.
risposte:
2 per risposta № 1O hai definito un tipo personalizzato che risponde a objectAtIndex: invece di utilizzare un array integrato o c'è qualcosa che non va nella tua configurazione. NSArray "s objectAtIndex: è definito per restituire il tipo "id", quindi il cast diil risultato per digitare "id" non ha alcun effetto. Inoltre, oggetti di qualsiasi tipo possono essere assegnati a id e oggetti di tipo id possono essere assegnati a qualsiasi altro tipo senza generare un avviso del compilatore.
In ogni caso, il casting del puntatore non ha alcun effetto in fase di esecuzione. Objective-C non modifica il modo in cui funzionano i puntatori in C oltre a fornire alcune conversioni implicite aggiuntive.