Wie heißt diese Form des Scoping? [Duplikat
Diese Frage hat hier bereits eine Antwort:
Objective-C Deklariere Variablen mit ({…}) 1 AntwortMehr oder weniger zufällig bin ich auf diese Form des Scoping gestoßen
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;
});
Ich denke, es ist eine gute Möglichkeit, Objekte und Variablen zu erstellen und zu instanziieren, da temporäre Variablen nur so lange gültig sind, wie sie für die Erstellung des Objekts benötigt werden, das ich wirklich brauche und für das ich mich interessiere. Im obigen Codeidx
wird verschwunden sein, sobald ich das innere @ schreidataSource
zum äußerendataSource
, da der Gültigkeitsbereich bald danach verlassen wird.
Auch finde ich die Tatsache ansprechend, dass ein vollständig instanziiertes und konfiguriertes Objekt auf das äußere Objekt gesetzt wird.
Eigentlich weiß ich nicht einmal, ob dies eine C- oder Objective-C-Funktion oder eine Syntax-Süßigkeit ist, die zu clang hinzugefügt wurde.
@ Unheilig
this ist eine Syntax zum Organisieren von Code. Es ist nicht so etwas wie ein Block oder eine Schließung. Am Ende des Codes steht ein vollständig instanziiertes und konfiguriertes Objekt.
Dies ist praktisch, wenn Sie ein Objekt nur benötigen, um es als Argument an eine Methode zu übergeben, die Konfiguration dieses Objekts jedoch mehrere Anweisungen erfordert. Anstatt es einer lokalen temporären Variablen zuzuweisen, können Sie einen Anweisungsausdruck übergeben.
[[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;
})];
n einer Nicht-ARC-Umgebung können Sie in der expression-Anweisung sogar autorelease aufrufe
So geht es nur um Code-Organisation und viel persönlichen Geschmack, denke ich.