Каковы детали "литералов Objective-C", упомянутых в примечаниях к выпуску Xcode 4.4?



Я просматривал заметки о выпуске для Xcode 4.4 и заметил это:




компилятор LLVM 4.0



Xcode теперь включает в себя компилятор Apple LLVM версии 4.0, включая следующие функции языка newObjective-C:
[...]

- Objective-C literals: создание литералов для NSArray, NSDictionary и NSNumber, точно так же, как литералы для NSString




я заинтригован этой функцией. Мне это не совсем понятно просто как литералы для NSString работа и как можно использовать их на NSArray,NSDictionary и NSNumber.



какие подробности?

580   3  

3 ответов:

скопировано дословно из http://cocoaheads.tumblr.com/post/17757846453/objective-c-literals-for-nsdictionary-nsarray-and:

литералы Objective-C: теперь можно создавать литералы для NSArray, NSDictionary и NSNumber (так же, как можно создавать литералы для NSString)

Литералы NSArray

ранее:

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

теперь:

array = @[ a, b, c ];

NSDictionary Литералы

ранее:

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

теперь:

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

NSNumber Литералы

ранее:

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

теперь:

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

[Edit]

zxoq at http://news.ycombinator.com/item?id=3672744 добавлена более интересная новая подписка. (Добавлено с литералами):

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

[редактирование 2]

новые литералы ObjC обсуждались в нескольких WWDC 2012 сеансы. Я намеренно не удалял имена файлов и время каждого слайда, чтобы вы могли найти их для себя, если хотите. Они по существу то же самое, что указано в этом посте, но есть также несколько новых вещей, которые я упомяну выше изображений.

обратите внимание, что изображения все большую. Просто перетащите их в другую вкладку, чтобы просмотреть их в оригинальный размер

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


эта часть является новой. Выражения Литералы

когда у вас есть выражение (M_PI / 16 например), вы должны положить его в скобках.

этот синтаксис работает для числовых выражений, логических значений, поиск индекса в строке (C -), логических значениях, константах перечисления и даже символьных строках!

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

подробнее о символьных строках и как / когда вы можете использовать этот литеральный синтаксис:

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...
}

как работают литералы массива

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

как словарные литералы работают

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

подробнее о подписке на массив

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

подробнее о подписке на словарь

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]

Майк Золы имеет большую запись об этих новых литералах. Если вы хотите узнать больше об этом материале, убедитесь, что зацените.


компилятор Objective-C имеет жестко закодированное знание макета памяти экземпляров NSConstantString класс, он же __CFConstantString класса. Проверьте

С "Литералы Objective-C"

1) NSNumber,NSDictionary и NSArray литералы доступны в Xcode 4.4.

2) NSDictionary и NSArray нужен знак "Xcode 4.4 и OS X 10.8 или позже SDK" или "Xcode 4.5 и iOS 6 или позже SDK"

мне кажется, что знак нуждается в поддержке во время выполнения и, следовательно, не работайте до iOS6.

Comments

    Ничего не найдено.