¿Cómo se llama esta forma de alcance? [duplicar
Esta pregunta ya tiene una respuesta aquí:
Objective-C Declara vars con ({…}) 1 respuestaMá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 e instanciar 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 arribaidx
desaparecerá tan pronto como escriba el @ interdataSource
al exteriordataSource
, ya que el alcance se dejará poco después.
También encuentro atractivo el hecho de que un objeto totalmente instanciado y configurado se establecerá en el objeto externo.
En realidad, ni siquiera sé si se trata de una función C o Objective-C o un dulce de sintaxis agregado al sonido metálico.
@ Unheilig
esta es una sintaxis para organizar el código. No es algo como un bloque o cierre. al final del código, solo tiene un objeto totalmente 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 liberación automática dentro de la declaración de expresión.
Así que solo se trata de la organización del código y mucho gusto personal, supongo.