Quali sono i dettagli di “Literature di Objective-C” menzionati nelle note di rilascio di Xcode 4.4?


188

Stavo esaminando le note di rilascio per Xcode 4.4 e ho notato questo:

Compilatore LLVM 4.0

Xcode ora include il compilatore Apple LLVM versione 4.0, incluse le seguenti nuove funzionalità del linguaggio C-Object-C: [...]
- Letterali Objective-C: crea letterali per NSArray, NSDictionary e NSNumber, esattamente come i letterali per NSString

Sono incuriosito da questa funzione. Non è del tutto chiaro per me Proprio come letterali per NSStringil lavoro e come si potesse usare su NSArray, NSDictionarye NSNumber.

Quali sono i dettagli?


Non è una risposta, ma qui ci sono alcune speculazioni: reddit.com/r/programming/comments/pso6x/xcode_43_released/…
Arjan Tijms

3
"Questo materiale non è soggetto a un accordo di non divulgazione?" E il tuo problema è?
Hejazzman,

7
No, Apple ha esplicitamente dichiarato che queste aggiunte non sono NDA nella mailing list.
Griotspeak


3
Ecco un link direttamente alla discussione di Clang sui letterali di Objective-C: clang.llvm.org/docs/ObjectiveCLiterals.html
ThomasW

Risposte:


393

Copiato letteralmente da http://cocoaheads.tumblr.com/post/17757846453/objective-c-literals-for-nsdictionary-nsarray-and :

Letterali Objective-C: ora è possibile creare valori letterali per NSArray, NSDictionary e NSNumber (proprio come si possono creare valori letterali per NSString)

NSArray Literals

In precedenza:

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

Adesso:

array = @[ a, b, c ];

NSDictionary Literals

In precedenza:

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

Adesso:

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

NSNumber Literals

In precedenza:

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

Adesso:

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

[Modificare]

zxoq all'indirizzo http://news.ycombinator.com/item?id=3672744 ha aggiunto nuovi abbonamenti più interessanti. (Aggiunto con valori letterali):

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

[Modifica 2]

I nuovi letterali di ObjC sono stati discussi in più sessioni del WWDC 2012 . Non ho rimosso intenzionalmente i nomi dei file e il tempo di ogni diapositiva in modo da poterli trovare da soli se ne hai voglia. Sono essenzialmente le stesse cose dichiarate in questo post, ma ci sono anche alcune cose nuove che citerò sopra le immagini.

Si noti che le immagini sono tutte grandi. Basta trascinarli in un'altra scheda per visualizzarli nella loro dimensione originale

Letteratura e boxe

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

Letteratura e boxe

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

Iscrizione alla raccolta

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

Iscrizione alla raccolta

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

@ # numeri, @ {} dizionari, @ "" stringhe, @ [] array, espressioni @ ()


Questa parte è nuova. Letterature di espressioni

Quando hai un'espressione ( M_PI / 16per esempio) dovresti metterla tra parentesi.

Questa sintassi funziona per espressioni numeriche, booleane, trovare un indice in una stringa (C-), valori booleani, costanti di enum e persino stringhe di caratteri!

Letterature di espressioni

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

Letterature di espressioni

NSNumber *piOverSixteen = @( M_PI / 16 );

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

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

NSNumber *writingDirection = @( NSWritingDirectionLeftToRight );

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

Altre informazioni sulle stringhe di caratteri e su come / quando è possibile utilizzare questa sintassi letterale:

Espressioni di stringhe inscatolate

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

Espressioni di stringhe inscatolate

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

Come funzionano i letterali array

Come funzionano i letterali array

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

Come funzionano i letterali del dizionario

Come funzionano i letterali del dizionario

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

Ulteriori informazioni sulla sottoscrizione di array

Sottoscrizione di array

@implementation SongList {
    NSMutableArray *_songs;
}

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

Sottoscrizione di array

@implementation SongList {
    NSMutableArray *_songs;
}

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

Altre informazioni sulla sottoscrizione del dizionario

Sottoscrizione al dizionario

@implementation Database {
    NSMutableDictionary *_storage;
}

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

Sottoscrizione al dizionario

@implementation Database {
    NSMutableDictionary *_storage;
}

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

[Modifica 3]

Mike Ash ha un grande commento su questi nuovi letterali. Se vuoi saperne di più su queste cose, assicurati di dare un'occhiata .



9
Posso vederlo accelerare la mia codifica!
Pedro Mancheno,

12
Esiste un modo per ottenere xCode 4.3 per supportare queste nuove notazioni? Li voglio - ORA ... ma NON SO "scalare la montagna" per loro ...
Alex Grey

20
Hai un sacco di contenuti testuali incorporati nelle immagini qui che sarebbero più reperibili da un motore di ricerca se fossero pubblicati come testo semplice.
Bill the Lizard

5
@BilltheLizard Non sono d'accordo con rispetto. La maggior parte del test è o cose non-ricercabile piace {e [, o sono parole generiche come array, ide @implementation. Le parole chiave pertinenti sono literal, objce xcodenon lo specifico menzioni di [o @implementation. Non vuoi che questa domanda venga visualizzata per le query ObjC generali su Google, dovrebbe essere visualizzata solo quando qualcuno esegue una query objc literal, che si verifica al momento (grazie al titolo e ai tag).
Pooria Azimi,

4
Ora si chiama risposta StackOverflow. Ottimo lavoro Pooria.
Nitish,

15

Il compilatore Objective-C ha una conoscenza codificata del layout di memoria delle istanze della NSConstantStringclasse, nota anche come __CFConstantStringclasse. Scopri la RewriteObjCStringLiteralfunzione nel lib/Rewrite/RewriteModernObjC.cppcodice sorgente di clang. Il compilatore emette semplicemente dati che corrispondono al layout delle istanze della NSConstantStringclasse.

Ci sono un paio di possibilità per letterale NSArraye NSDictionaryistanze. Potrebbero fare qualcosa di simile a quello che hanno fatto per le stringhe letterali: codificare il layout dell'istanza (per una sottoclasse speciale) nel compilatore ed emettere i dati in quel layout. Oppure potrebbero avere il codice di emissione del compilatore che crea semplicemente un'istanza in fase di esecuzione.


2
L'implementazione della sintassi letterale dell'oggetto per NSArrayed NSDictionaryè abbastanza diversa da quella di NSString. Il compilatore genera semplicemente una chiamata NSDictionaryo NSArrayin fase di esecuzione. Questo è anche il motivo per cui le variabili globali non possono essere inizializzate usando questa sintassi (diversamente NSString). Ciò richiederebbe che il risultato sia una costante di tempo di compilazione.
Buzzy,

1

Da "Letterature Objective-C"

1) NSNumber, NSDictionarye NSArrayletterali sono disponibili in Xcode 4.4 .

2) NSDictionarye la NSArraysottoscrizione richiede " Xcode 4.4 e OS X 10.8 o successivo SDK " o " Xcode 4.5 e iOS 6 o successivo SDK "

Mi sembra che la sottoscrizione abbia bisogno del supporto di runtime e quindi non funzionerà prima di iOS6 .


nello stesso articolo dice "Distribuisce nuovamente su iOS 4" nella colonna "
Distribuzione

1
Ho accidentalmente usato valori letterali array in un progetto che ho compilato con Xcode 4.5. Funziona bene su un iPad con iOS5. Non si compila su Xcode 4.2, ed è così che ho scoperto di averlo fatto.
JScarry,

La sottoscrizione può funzionare con Xcode 4.4 e l'SDK iOS5 con cui viene fornita se aggiungi un'intestazione: github.com/tewha/iOS-Subscripting/blob/master/…
Steven Fisher
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.