Más o menos por accidente me topé con esta forma de alcance
DataSource *dataSource =({
NSInteger idx = [[self.tableView indexPathForSelectedRow] row];
DataSource *dataSource = [DataSource new];
dataSource.address = self.destinations[idx][0];
dataSource.name = self.destinations[idx][1];
dataSource;
});
Creo que es una buena manera de crear y crear instancias de objetos y variables, ya que las variables temporales solo vivirán mientras sean necesarias para crear el objeto que realmente necesito y cuido. En el código de arriba idx
se irá tan pronto como escriba el interior dataSource
al exterior dataSource
ya que el alcance se dejará poco después.
También encuentro atractivo el hecho de que un objeto completamente instanciado y configurado se establecerá en el objeto externo.
En realidad, ni siquiera sé si se trata de una característica de C o de Objective-C o un dulce de sintaxis agregado a clang.
@Unheilig
esta es una sintaxis para organizar código. no es algo así como un bloqueo o un cierre. al final del código, solo tiene un objeto completamente instanciado y configurado.
Esto es útil si necesita un objeto solo para pasarlo como argumento a un método, pero la configuración de ese objeto requiere más de una declaración. En lugar de asignarlo a una variable temporal local, puede pasar una expresión de declaración.
[[MYViewController alloc] initWithDataSource:({
NSInteger idx = [[self.tableView indexPathForSelectedRow] row];
DataSource *dataSource = [DataSource new];
dataSource.address = self.destinations[idx][@"address"];
dataSource.name = self.destinations[idx][@"name"];
dataSource;
})];
En un entorno que no sea ARC, incluso podría llamar a autorelease dentro de la declaración de expresión.
Entonces, supongo que se trata solo de organización del código y mucho gusto personal.
Espero que te haya funcionado bien hasta ahora. ¿Podría citar un escenario en el que esto podría ser útil? ¿Cómo lo llamarías/invocarías? Gracias por adelantado.
– Unheilig
13 de enero de 2014 a las 2:54
@Unheilig, mira mi edición
– vikingosegundo
13 de enero de 2014 a las 9:00