Xcode 4.4发行说明中提到的"Objective-C Literals"的细节是什么?

Ped*_*eno 188 xcode objective-c objective-c-literals

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

LLVM 4.0编译器

Xcode现在包含Apple LLVM Compiler 4.0版,包括以下newObjective-C语言特性:[...]
- Objective-C文字:为NSArray,NSDictionary和NSNumber创建文字,与NSString的文字相同

我对这个功能很感兴趣.这并不完全清楚,我是多么的文字NSString工作,以及如何一个可以在使用它们NSArray,NSDictionaryNSNumber.

有什么细节?

Poo*_*imi 393

http://cocoaheads.tumblr.com/post/17757846453/objective-c-literals-for-nsdictionary-nsarray-并逐字复制:

Objective-C文字:现在可以为NSArray,NSDictionary和NSNumber创建文字(就像可以为NSString创建文字一样)

NSArray文字

先前:

array = [NSArray arrayWithObjects:a, b, c, nil];
Run Code Online (Sandbox Code Playgroud)

现在:

array = @[ a, b, c ];
Run Code Online (Sandbox Code Playgroud)

NSDictionary文字

先前:

dict = [NSDictionary dictionaryWithObjects:@[o1, o2, o3]
                                   forKeys:@[k1, k2, k3]];
Run Code Online (Sandbox Code Playgroud)

现在:

dict = @{ k1 : o1, k2 : o2, k3 : o3 };
Run Code Online (Sandbox Code Playgroud)

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];
Run Code Online (Sandbox Code Playgroud)

现在:

NSNumber *number;
number = @'X';
number = @12345;
number = @12345ul;
number = @12345ll;
number = @123.45f;
number = @123.45;
number = @YES;
Run Code Online (Sandbox Code Playgroud)

[编辑]

zxoqhttp://news.ycombinator.com/item?id=3672744添加了更多有趣的新订阅.(添加文字):

arr[1]      === [arr objectAtIndex:1]
dict[@"key"] === [dict objectForKey:@"key"]
Run Code Online (Sandbox Code Playgroud)

[编辑2]

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

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

文学与拳击

[NSNumber numberWithint:42]
[NSNumber numberWithDouble:10.8]
[NSNumber numberWithBool:YES]
[NSNumber numberWithint:6 + x * 2012]
Run Code Online (Sandbox Code Playgroud)

文学与拳击

@42
@10.8
@YES
@(6 + x * 2012)
Run Code Online (Sandbox Code Playgroud)

收集订阅

[NSArray arrayWithObjects: a, b, c, nil]
[array objectAtIndex:i]
[NSDictionary dictionaryWithObjectsAndKeys: v1, k1, v2, k2, nil];
[dictionary valueForKey:k]
Run Code Online (Sandbox Code Playgroud)

收集订阅

@[a, b, c]
array[i]
@{k1:v1, k2:v2}
dictionary[k]
Run Code Online (Sandbox Code Playgroud)

@#numbers,@ {}词典,@


这部分是新的.表达文字

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

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

表达文字

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")];
Run Code Online (Sandbox Code Playgroud)

表达文字

NSNumber *piOverSixteen = @( M_PI / 16 );

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

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

NSNumber *writingDirection = @( NSWritingDirectionLeftToRight );

NSNumber *path = @( getenv("PATH") );
Run Code Online (Sandbox Code Playgroud)

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

盒装字符串表达式

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

盒装字符串表达式

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

数组文字如何工作

数组文字如何工作

// 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];
Run Code Online (Sandbox Code Playgroud)

字典文字如何工作

字典文字如何工作

// 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];
Run Code Online (Sandbox Code Playgroud)

有关数组下载的更多信息

数组订阅

@implementation SongList {
    NSMutableArray *_songs;
}

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

数组订阅

@implementation SongList {
    NSMutableArray *_songs;
}

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

更多关于字典下载

字典订阅

@implementation Database {
    NSMutableDictionary *_storage;
}

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

字典订阅

@implementation Database {
    NSMutableDictionary *_storage;
}

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

[编辑3]

Mike Ash对这些新文字有很好的写作.如果您想了解更多有关此内容的信息,请务必查看.


  • 您在此处的图像中嵌入了大量文本内容,如果将其作为纯文本发布,搜索引擎将更容易找到这些文本内容. (20认同)
  • 有没有办法让xCode 4.3支持这些新的符号?我想要他们 - **现在**......但是_SO_并没有为他们"上山"...... (12认同)
  • 我可以看到这加快了我的编码速度! (9认同)
  • @BilltheLizard我恭敬地不同意.大多数测试都是不可搜索的东西,如`{`和`[`,或者是`array`,`id`和`@ implementation`等通用词.相关的关键字是`literal`,`objc`和`xcode`,而不是`[`或`@ implementation``的具体提及.你不希望这个问题出现在Google上的一般ObjC查询中,它只应在有人查询`objc literal`时显示,这在当前发生(感谢标题和标签). (5认同)
  • 现在称为StackOverflow答案.Pooria很好. (4认同)
  • @alex:Xcode 4.4预览3在10.7上运行得很好; 发布文档说10.7.3或更高. (2认同)
  • 只是说:第二个例子`dict [@ 1] === [dict objectAtIndex:1]`无效 - `NSDictionary`没有`-objectAtIndex:`方法. (2认同)

rob*_*off 15

Objective-C编译器具有NSConstantString类的实例(即类)的内存布局的硬编码知识__CFConstantString.查看clang源代码中的RewriteObjCStringLiteral函数lib/Rewrite/RewriteModernObjC.cpp.编译器只发出与NSConstantString类实例布局匹配的数据.

文字NSArrayNSDictionary实例有几种可能性.他们可以做类似于文字字符串的操作 - 在编译器中硬编码实例布局(用于特殊子类)并在该布局中发出数据.或者他们可以让编译器发出只在运行时创建实例的代码.

  • `NSArray`和`NSDictionary`的对象文字语法的实现与`NSString`完全不同.编译器只是在运行时生成对`NSDictionary`或`NSArray`的调用.这也是使用这种语法无法初始化全局变量的原因(与`NSString`不同).这将要求结果为编译时常量. (2认同)