objective-c - Xcode 4.4 发行说明中提到的 "Objective-C Lite

我在浏览 Xcode 4.4 的发行说明时注意到了这一点:

LLVM 4.0 Compiler

Xcode now includes the Apple LLVM Compiler version 4.0, including the following newObjective-C language features: [...]
- Objective-C literals: create literals for NSArray, NSDictionary, and NSNumber, just the same as the literals for NSString

我对这个功能很感兴趣。我并不完全清楚 NSString 的文字是如何工作的,以及如何在 NSArrayNSDictionaryNSNumber。

详情是什么?

最佳答案

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

[编辑]

http://news.ycombinator.com/item?id=3672744 的

zxoq 添加了更多有趣的新下标。 (添加文字):

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

[编辑 2]

在多个 WWDC 2012 session 中讨论了新的 ObjC 文字。我故意没有删除每张幻灯片的文件名和时间,所以如果你愿意,你可以自己找到它们。它们本质上与本文所述相同,但还有一些我将在图片上方提到的新事物。

请注意,图片都很大。只需将它们拖到另一个选项卡中即可以原始大小查看它们

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

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

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

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


这部分是新的。 表达式文字

如果你有一个表达式(例如M_PI/16),你应该把它放在括号内。

此语法适用于数字表达式、 bool 值、在 (C-) 字符串中查找索引、 bool 值、枚举常量,甚至字符串!

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

NSNumber *piOverSixteen = @( M_PI / 16 );

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

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

NSNumber *writingDirection = @( NSWritingDirectionLeftToRight );

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

有关字符串以及如何/何时使用此文字语法的更多信息:

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

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

数组字面量的工作原理

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

字典文字的工作原理

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

更多关于数组下标

@implementation SongList {
    NSMutableArray *_songs;
}

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

@implementation SongList {
    NSMutableArray *_songs;
}

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

更多关于字典下标

@implementation Database {
    NSMutableDictionary *_storage;
}

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

@implementation Database {
    NSMutableDictionary *_storage;
}

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

[编辑 3]

Mike Ash 有一篇关于这些新文字的精彩文章。如果您想了解更多关于这些东西的信息,请确保 check it out 。


关于objective-c - Xcode 4.4 发行说明中提到的 "Objective-C Literals"的详细信息是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9347722/

相关文章:

objective-c - 在 Objective-C 中,Java 的 "instanceof"关

objective-c - 洗牌 NSMutableArray 的最佳方法是什么?

ios - UICollectionView 中的单元格间距

objective-c - 禁用某些文件的自动引用计数

objective-c - 为什么 ARC 仍然需要 @autoreleasepool?

c - Objective-C : BOOL vs bool

ios - UITableViewCell 显示白色背景,在 iOS7 上无法修改

objective-c - respondsToSelector 的 Swift 等价物是什么?

objective-c - Xcode 5 中提供了哪些新的文档命令?

ios - 如何对字符串进行 URL 编码