wake-up-neo.com

Welche Details zu "Objective-C-Literalen" finden Sie in den Versionshinweisen zu Xcode 4.4?

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 neuenObjective-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. Mir ist nicht ganz klar, wie Literale für NSString funktionieren und wie man sie für NSArray, NSDictionary und NSNumber verwenden könnte.

Was sind die Details?

188
Pedro Mancheno

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 erstellen, NSDictionary und NSNumber (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 Literals

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 at http://news.ycombinator.com/item?id=3672744 hat ein interessanteres neues Abonnement hinzugefügt. (Hinzugefügt mit Literalen):

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

[Edit 2]

Die neuen ObjC-Literale wurden in mehreren WWDC 2012 Sessions diskutiert. Ich habe die Dateinamen und die Uhrzeit der einzelnen Folien absichtlich nicht entfernt, damit Sie sie bei Bedarf selbst finden können. Es ist im Wesentlichen dasselbe wie in diesem Beitrag, 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 Originalgröße anzuzeigen

Literals & Boxing

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

Literals & Boxing

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

Collection Subscripting

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

Collection Subscripting

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

@# numbers, @{} dictionaries, @"" strings, @[] arrays, @() expressions


Dieser Teil ist neu. Ausdrucksliterale

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

Diese Syntax funktioniert für numerische Ausdrücke, Boolesche Werte, Aufzählungskonstanten und sogar Zeichenfolgen, um einen Index in einer (C-) Zeichenfolge zu finden!

Expression Literals

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")];

Expression Literals

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 Literal-Syntax verwenden können:

Boxed String Expressions

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

Boxed String Expressions

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

So funktionieren Array-Literale

How array literals work

// 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];

So funktionieren Wörterbuchliterale

How dictionary literals work

// 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 zur Array-Subskription

Array Subscripting

@implementation SongList {
    NSMutableArray *_songs;
}

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

Array Subscripting

@implementation SongList {
    NSMutableArray *_songs;
}

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

Mehr zur Wörterbuch-Subskription

Dictionary Subscripting

@implementation Database {
    NSMutableDictionary *_storage;
}

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

Dictionary Subscripting

@implementation Database {
    NSMutableDictionary *_storage;
}

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

[Edit 3]

Mike Ash hat eine großartige Beschreibung dieser neuen Literale. Wenn Sie mehr über dieses Zeug wissen wollen, stellen Sie sicher, dass Sie check it out .


393
Pooria Azimi

Der Objective-C-Compiler verfügt über fest codierte Kenntnisse über das Speicherlayout von Instanzen der Klasse NSConstantString, auch bekannt als __CFConstantString Klasse. Überprüfen Sie die RewriteObjCStringLiteral -Funktion in lib/Rewrite/RewriteModernObjC.cpp im clang-Quellcode. Der Compiler gibt einfach Daten aus, die dem Layout von Instanzen der Klasse NSConstantString entsprechen.

Es gibt verschiedene Möglichkeiten für die Literalinstanzen NSArray und NSDictionary. Sie könnten so etwas wie das tun, was sie für wörtliche Zeichenfolgen getan haben - 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.

15
rob mayoff

From "Objective-C Literals"

1) Die Literale NSNumber, NSDictionary und NSArray sind in Xcode 4.4 verfügbar.

2) NSDictionary und NSArray müssen abonniert werden " Xcode 4.4 und OS X 10.8 oder späteres SDK "oder" Xcode 4.5 und iOS 6 oder späteres SDK

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

1
Andz