繁体   English   中英

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

[英]What are the details of “Objective-C Literals” mentioned in the Xcode 4.4 release notes?

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

LLVM 4.0 编译器

Xcode 现在包含 Apple LLVM 编译器 4.0 版,包括以下新的Objective-C 语言特性:[...]
- Objective-C 文字:为 NSArray、NSDictionary 和 NSNumber 创建文字,与 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会议中讨论了新的 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 )时,你应该把它放在括号里。

此语法适用于数字表达式、布尔值、在 (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")];

表达式文字

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有一篇关于这些新文字的精彩文章。 如果您想了解更多有关这些内容的信息,请务必查看


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

文字NSArrayNSDictionary实例有几种可能性。 他们可以做一些类似于他们对文字字符串所做的事情 - 在编译器中硬编码实例布局(对于特殊子类)并在该布局中发出数据。 或者他们可以让编译器发出代码,在运行时简单地创建一个实例。

来自“Objective-C 文字”

1) NSNumberNSDictionaryNSArray文字在Xcode 4.4中可用。

2) NSDictionaryNSArray下标需要“ Xcode 4.4 and OS X 10.8 or later SDK ”或“ Xcode 4.5 and iOS 6 or later SDK

在我看来,下标需要运行时支持,因此在iOS6之前不起作用

Apple LLVM Compiler 4.0 添加了对 Objective-C 的字面支持。 它从at sign @开始

NSNumber 字面量

NSNumber *someBool = [NSNumber numberWithBool:YES];
//BOOL literal
NSNumber *someBool = @YES;
     
NSNumber *someChar= [NSNumber numberWithChar:'a'];
//character literal
NSNumber *someChar = @'a';
     
NSNumber *someInt = [NSNumber numberWithInt:1];
NSNumber *someInt = [NSNumber numberWithUnsignedInt:1U];
NSNumber *someInt = [NSNumber numberWithLong:1L];
NSNumber *someInt = [NSNumber numberWithLongLong:1LL];
//integer literal
NSNumber *someInt = @1;
NSNumber *someInt = @1U;
NSNumber *someInt = @1L;
NSNumber *someInt = @1LL;
     
NSNumber *someFloat = [NSNumber numberWithFloat:3.141592654F];
NSNumber *someFloat = [NSNumber numberWithDouble:3.1415926535];
//float literal
NSNumber *someFloat = @3.141592654F;    
NSNumber *someFloat = @3.1415926535; 

集合文字

NSArray *someArray = [NSArray arrayWithObjects: @"A", @"B", @"C", nil];
//array literal
NSArray *someArray = @[ @"A", @"B", @"C" ];

NSDictionary *someDict = [NSDictionary dictionaryWithObjectsAndKeys:
                           @"key1", @"value1",
                           @"key1", @"value2",
                           nil];
//dictionary literal
NSDictionary *someDict = @{ @"Character" : @"Zelda",
                         @"key1" : @"value2",
                         @"key2" : @value2 };

集合下标

NSString *var1 = [someArray objectAtIndex:0]; // Returns 'A' 
NSString *var2 = [someDict objectForKey:@"key1"]; // Returns 'value1'
//Collection Subscripting
//read
NSString *var1 = someArray[0]; // Returns 'A'
NSString *var2 = someDict[@"key1"]; // Returns 'value1'
//write to mutable collection
someArray[0] = @"AA";
someDict[@"key1"] = @"value11";

Boxed Expressions - 将 C 风格的表达式转换为 Objective-C。 适用于数字、枚举、结构

//Syntax @( <expression> )
[NSNumber numberWithInt:(INT_MAX + 1)];
//Boxed Expressions
NSNumber *var = @(INT_MAX + 1); 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM