Welche Details zu „Objective-C-Literalen“ werden in den Versionshinweisen zu Xcode 4.4 erwähnt?


188

Ich habe die Versionshinweise für Xcode 4.4 durchgesehen und Folgendes festgestellt:

LLVM 4.0 Compiler

Xcode enthält jetzt den Apple LLVM Compiler Version 4.0, einschließlich der folgenden neuen
Objective-C- Sprachfunktionen: [...] - Objective-C-Literale: Erstellen Sie Literale für NSArray, NSDictionary und NSNumber, genau wie die Literale für NSString

Ich bin fasziniert von dieser Funktion. Es ist nicht ganz zu mir klar, wie Literale für NSStringArbeit und wie man sie nutzen könnte auf NSArray, NSDictionaryund NSNumber.

Was sind die Details?


Keine Antwort, aber hier gibt es einige Spekulationen: reddit.com/r/programming/comments/pso6x/xcode_43_released/…
Arjan Tijms

3
"Unterliegt dieses Material nicht einer NDA?" Und dein Problem ist?
Hejazzman

7
Nein, Apple hat ausdrücklich gesagt, dass diese Ergänzungen nicht NDA auf der Mailingliste sind.
Griotspeak


3
Hier ist ein Link direkt zur Clang-Diskussion über Objective-C-Literale: clang.llvm.org/docs/ObjectiveCLiterals.html
ThomasW

Antworten:


393

Wörtlich kopiert von http://cocoaheads.tumblr.com/post/17757846453/objective-c-literals-for-nsdictionary-nsarray-and :

Objective-C-Literale: Man kann jetzt Literale für NSArray, NSDictionary und NSNumber erstellen (genau wie man Literale für NSString erstellen kann).

NSArray Literals

Vorher:

array = [NSArray arrayWithObjects:a, b, c, nil];

Jetzt:

array = @[ a, b, c ];

NSDictionary Literale

Vorher:

dict = [NSDictionary dictionaryWithObjects:@[o1, o2, o3]
                                   forKeys:@[k1, k2, k3]];

Jetzt:

dict = @{ k1 : o1, k2 : o2, k3 : o3 };

NSNumber Literals

Vorher:

NSNumber *number;
number = [NSNumber numberWithChar:'X'];
number = [NSNumber numberWithInt:12345];
number = [NSNumber numberWithUnsignedLong:12345ul];
number = [NSNumber numberWithLongLong:12345ll];
number = [NSNumber numberWithFloat:123.45f];
number = [NSNumber numberWithDouble:123.45];
number = [NSNumber numberWithBool:YES];

Jetzt:

NSNumber *number;
number = @'X';
number = @12345;
number = @12345ul;
number = @12345ll;
number = @123.45f;
number = @123.45;
number = @YES;

[Bearbeiten]

zxoq unter http://news.ycombinator.com/item?id=3672744 hat weitere interessante neue Abonnements hinzugefügt. (Hinzugefügt mit Literalen):

arr[1]      === [arr objectAtIndex:1]
dict[@"key"] === [dict objectForKey:@"key"]

[Bearbeiten 2]

Die neuen ObjC-Literale wurden in mehreren WWDC 2012- Sitzungen erörtert . Ich habe absichtlich die Dateinamen und die Uhrzeit jeder Folie nicht entfernt, damit Sie sie selbst finden können, wenn Sie Lust dazu haben. Sie sind im Wesentlichen dasselbe wie in diesem Beitrag angegeben, aber es gibt auch einige neue Dinge, die ich über den Bildern erwähnen werde.

Bitte beachten Sie, dass alle Bilder groß sind. Ziehen Sie sie einfach in eine andere Registerkarte, um sie in ihrer ursprünglichen Größe anzuzeigen

Literale & Boxen

[NSNumber numberWithint:42]
[NSNumber numberWithDouble:10.8]
[NSNumber numberWithBool:YES]
[NSNumber numberWithint:6 + x * 2012]

Literale & Boxen

@42
@10.8
@YES
@(6 + x * 2012)

Sammlungsabonnement

[NSArray arrayWithObjects: a, b, c, nil]
[array objectAtIndex:i]
[NSDictionary dictionaryWithObjectsAndKeys: v1, k1, v2, k2, nil];
[dictionary valueForKey:k]

Sammlungsabonnement

@[a, b, c]
array[i]
@{k1:v1, k2:v2}
dictionary[k]

@ # Zahlen, @ {} Wörterbücher, @ "" Strings, @ [] Arrays, @ () Ausdrücke


Dieser Teil ist neu. Ausdrucksliterale

Wenn Sie einen Ausdruck haben ( M_PI / 16zum Beispiel), sollten Sie ihn in Klammern setzen.

Diese Syntax funktioniert für numerische Ausdrücke, Boolesche Werte, das Finden eines Index in einer (C-) Zeichenfolge, Boolesche Werte, Aufzählungskonstanten und sogar Zeichenfolgen!

Ausdrucksliterale

NSNumber *piOverSixteen = [NSNumber numberWithDouble: (M_PI / 16)];

NSNumber *hexDigit = [NSNumber numberWithChar:"0123456789ABCDEF"[i % 16]];

NSNumber *usesScreenFonts = [NSNumber numberWithBool:[NSLayoutManager usesScreenFonts]];

NSNumber *writingDirection = [NSNumber numberWithInt:NSWritingDirectionLeftToRight];

NSNumber *path = [NSString stringWithUTF8String: getenv("PATH")];

Ausdrucksliterale

NSNumber *piOverSixteen = @( M_PI / 16 );

NSNumber *hexDigit = @( "0123456789ABCDEF"[i % 16] );

NSNumber *usesScreenFonts = @( [NSLayoutManager usesScreenFonts] );

NSNumber *writingDirection = @( NSWritingDirectionLeftToRight );

NSNumber *path = @( getenv("PATH") );

Weitere Informationen zu Zeichenfolgen und wie / wann Sie diese wörtliche Syntax verwenden können:

Boxed String-Ausdrücke

NSString *path = [NSString stringWithUTF8String: getenv("PATH")];
for (NSString *dir in [path componentsSeparatedByString: @":"]) {
    // search for a file in dir...
}

Boxed String-Ausdrücke

NSString *path = @( getenv("PATH") );
for (NSString *dir in [path componentsSeparatedByString: @":"]) {
    // search for a file in dir...
}

Wie Array-Literale funktionieren

Wie Array-Literale funktionieren

// when you write this:
array = @[a, b, c ];

// compiler generates:
id objects[] = { a, b, c };
NSUInteger count = sizeof(objects) / sizeof(id);
array = [NSArray arrayWithObjects:objects count:count];

Wie Wörterbuchliterale funktionieren

Wie Wörterbuchliterale funktionieren

// when you write this:
dict = @{k1 : o1, k2 : o2, k3 : o3 };

// compiler generates:
id objects[] = { o1, o2, o3 };
id keys[] = { k1, k2, k3 };
NSUInteger count = sizeof(objects) / sizeof(id);
dict = [NSDictionary dictionaryWithObjects:objects
                                   forKeys:keys
                                     count:count];

Weitere Informationen zum Array-Abonnement

Array-Subskription

@implementation SongList {
    NSMutableArray *_songs;
}

- (Song *)replaceSong:(Song *)newSong atindex:(NSUinteger)idx {
    Song *oldSong = [_songs objectAtIndex:idx];
    [_songs replaceObjectAtindex:idx withObject:newSong];
    return oldSong;
}

Array-Subskription

@implementation SongList {
    NSMutableArray *_songs;
}

- (Song *)replaceSong:(Song *)newSong atindex:(NSUinteger)idx {
    Song *oldSong = _songs[idx];
    _songs[idx] = newSong;
    return oldSong;
}    

Weitere Informationen zum Abonnieren von Wörterbüchern

Wörterbuch-Abonnement

@implementation Database {
    NSMutableDictionary *_storage;
}

- (id)replaceObject:(id)newObject forKey:(id <NSCopying>)key {
    id oldObject = [_storage objectForKey:key];
    [_storage setObject:object forKey:key];
    return oldObject;
}

Wörterbuch-Abonnement

@implementation Database {
    NSMutableDictionary *_storage;
}

- (id)replaceObject:(id)newObject forKey:(id <NSCopying>)key {
    id oldObject = _storage[key];
    _storage[key] = newObject;
    return oldObject;
}

[Bearbeiten 3]

Mike Ash hat eine großartige Zusammenfassung über diese neuen Literale. Wenn Sie mehr über dieses Zeug erfahren möchten, schauen Sie es sich an .



9
Ich kann sehen, dass dies meine Codierung beschleunigt!
Pedro Mancheno

12
Gibt es eine Möglichkeit, xCode 4.3 dazu zu bringen, diese neuen Notationen zu unterstützen? Ich will sie - JETZT ... aber bin SO nicht "bergauf" für sie ...
Alex Gray

20
Sie haben hier eine Menge Textinhalte in Bilder eingebettet, die von einer Suchmaschine leichter gefunden werden könnten, wenn sie als einfacher Text veröffentlicht würden.
Bill the Lizard

5
@ BilltheLizard Ich bin respektvoll anderer Meinung. Der größte Teil des Tests ist entweder un-durchsuchbare Dinge mögen {und [oder sind generische Begriffe wie array, idund @implementation. Die entsprechenden Schlüsselwörter sind literal, objcund xcodenicht die spezifische Erwähnungen [oder @implementation. Sie möchten nicht, dass diese Frage bei allgemeinen ObjC-Abfragen bei Google angezeigt wird. Sie sollte nur angezeigt werden, wenn jemand Fragen stellt objc literal, was derzeit der Fall ist (dank Titel und Tags).
Pooria Azimi

4
Das nennt man eine StackOverflow-Antwort. Gute Arbeit Pooria.
Nitish

15

Der Objective-C-Compiler verfügt über fest codierte Kenntnisse über das Speicherlayout von Instanzen der NSConstantStringKlasse, auch bekannt als die __CFConstantStringKlasse. Überprüfen Sie die RewriteObjCStringLiteralFunktion im lib/Rewrite/RewriteModernObjC.cppClang-Quellcode. Der Compiler gibt einfach Daten aus, die dem Layout der Instanzen der NSConstantStringKlasse entsprechen.

Es gibt verschiedene Möglichkeiten für Literale NSArrayund NSDictionaryInstanzen. Sie könnten so etwas wie für Literalzeichenfolgen tun - das Instanzlayout (für eine spezielle Unterklasse) im Compiler fest codieren und Daten in diesem Layout ausgeben. Oder der Compiler gibt Code aus, der zur Laufzeit einfach eine Instanz erstellt.


2
Die Implementierung der Objektliteral-Syntax für NSArrayund NSDictionaryist ganz anders als die von NSString. Der Compiler generiert einfach nur einen Aufruf an NSDictionaryoder NSArrayzur Laufzeit. Aus diesem Grund können globale Variablen auch nicht mit dieser Syntax initialisiert werden (im Gegensatz zu NSString). Dies würde erfordern, dass das Ergebnis eine Kompilierungszeitkonstante ist.
Buzzy

1

Aus "Objective-C-Literalen"

1) NSNumber, NSDictionaryund NSArrayLiterale sind in Xcode 4.4 .

2) NSDictionaryund NSArrayAbonnements benötigen " Xcode 4.4 und OS X 10.8 oder höher SDK " oder " Xcode 4.5 und iOS 6 oder höher SDK ".

Sieht für mich so aus, als ob das Abonnement Laufzeitunterstützung benötigt und daher vor iOS6 nicht funktioniert .


Im selben Artikel heißt es in der Spalte "iOS-Bereitstellung" "Bereitstellen auf iOS 4"
Code007

1
Ich habe versehentlich Array-Literale in einem Projekt verwendet, das ich mit Xcode 4.5 kompiliert habe. Es läuft gut auf einem iPad mit iOS5. Es wird nicht auf Xcode 4.2 kompiliert. So habe ich herausgefunden, dass ich es getan habe.
JScarry

Abonnements können mit Xcode 4.4 und dem mitgelieferten iOS5-SDK erstellt werden, wenn Sie einen Header hinzufügen: github.com/tewha/iOS-Subscripting/blob/master/…
Steven Fisher
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.