รายละเอียดของ“ Objective-C Literals” ระบุไว้ในบันทึกย่อประจำรุ่น Xcode 4.4 อย่างไร


188

ฉันกำลังอ่านบันทึกประจำรุ่นสำหรับ Xcode 4.4 และสังเกตสิ่งนี้:

LLVM 4.0 คอมไพเลอร์

Xcode มี Apple LLVM Compiler เวอร์ชั่น 4.0 รวมถึงฟีเจอร์ภาษา newObjective-C ต่อไปนี้: [... ]
- Objective-C literals: สร้างตัวอักษรสำหรับ NSArray, NSDictionary และ NSNumber เหมือนกับตัวอักษรของ NSString

ฉันสนใจคุณลักษณะนี้มาก มันไม่ได้อย่างสิ้นเชิงชัดเจนกับผมเพียงวิธีการที่ตัวอักษรสำหรับNSStringการทำงานและวิธีการหนึ่งที่สามารถใช้พวกเขาในNSArray, และNSDictionaryNSNumber

มีรายละเอียดอะไรบ้าง?


ไม่ใช่คำตอบ แต่มีการเก็งกำไรอยู่ที่นี่: reddit.com/r/programming/comments/pso6x/xcode_43_released/…
Arjan Tijms

3
"เนื้อหานี้ไม่อยู่ภายใต้ NDA หรือไม่" และปัญหาของคุณคืออะไร?
Hejazzman

7
ไม่ Apple ได้กล่าวอย่างชัดเจนว่าการเพิ่มเติมเหล่านี้ไม่ใช่ NDA ในรายการส่งเมล
griotspeak

2
LLVM มีเอกสารไม่กี่ข้อเกี่ยวกับเรื่องนี้: clang.llvm.org/docs/LanguageExtensions.html#objc_lambdas
Steven Kramer

3
นี่คือลิงค์โดยตรงไปยังการอภิปรายเสียงดังกราวของตัวอักษร Objective-C: clang.llvm.org/docs/ObjectiveCLiterals.html
ThomasW

คำตอบ:


393

คัดลอกคำต่อคำจากhttp://cocoaheads.tumblr.com/post/17757846453/objective-c-literals-for-nsdictionary-nsarray-and :

วัตถุประสงค์ -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;

[แก้ไข]

zxoqที่http://news.ycombinator.com/item?id=3672744ได้เพิ่มตัวห้อยใหม่ที่น่าสนใจมากขึ้น (เพิ่มด้วยตัวอักษร):

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

[แก้ไข 2]

ตัวอักษร ObjC ใหม่ถูกกล่าวถึงในช่วงWWDC 2012หลายครั้ง ฉันตั้งใจไม่ลบชื่อไฟล์และเวลาของแต่ละสไลด์เพื่อให้คุณสามารถค้นหาได้ด้วยตัวเองหากคุณรู้สึกว่า โดยพื้นฐานแล้วมันก็เหมือนกับที่ระบุไว้ในโพสต์นี้ แต่ก็มีสิ่งใหม่ ๆ ที่ฉันจะพูดถึงข้างต้น

โปรดทราบว่าภาพทั้งหมดมีขนาดใหญ่ เพียงลากไปไว้ในแท็บอื่นเพื่อดูในขนาดดั้งเดิม

วรรณกรรมและมวย

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

@ # numbers, @ {} พจนานุกรม, @ "" สตริง, @ [] อาร์เรย์, @ () นิพจน์


ส่วนนี้เป็นของใหม่ ตัวอักษรนิพจน์

เมื่อคุณมีนิพจน์ ( M_PI / 16ตัวอย่าง) คุณควรใส่มันไว้ในวงเล็บ

ไวยากรณ์นี้ใช้สำหรับนิพจน์ตัวเลข, บูลีน, การค้นหาดัชนีในสตริง (C-), ค่าบูลีน, ค่าคงที่ enum และแม้แต่สตริงอักขระ!

ตัวอักษรนิพจน์

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มีการเขียนที่ดีเกี่ยวกับตัวอักษรใหม่เหล่านี้ หากคุณต้องการทราบข้อมูลเพิ่มเติมเกี่ยวกับสิ่งนี้ให้แน่ใจว่าจะตรวจสอบออก



9
ฉันสามารถเห็นสิ่งนี้เร่งการเข้ารหัสของฉัน!
Pedro Mancheno

12
มีวิธีใดที่จะได้รับ xCode 4.3 เพื่อรองรับสัญลักษณ์ใหม่เหล่านี้? ผมต้องการให้พวกเขา - ตอนนี้ ... แต่กำลังSOไม่ได้ "จะขึ้นภูเขา" สำหรับพวกเขา ...
อเล็กซ์สีเทา

20
คุณมีเนื้อหาที่เป็นข้อความจำนวนมากฝังอยู่ในภาพที่นี่ซึ่งเครื่องมือค้นหาจะสามารถค้นหาได้มากขึ้นหากมีการโพสต์เป็นข้อความธรรมดา
Bill the Lizard

5
@BilltheLizard ฉันไม่เห็นด้วยอย่างเคารพ ส่วนใหญ่ของการทดสอบเป็นทั้งสิ่งที่ยกเลิกการค้นหาชอบ{และ[หรือเป็นคำทั่วไปเช่นarray, และid @implementationคำหลักที่เกี่ยวข้องliteral, objcและxcodeไม่เฉพาะเจาะจงกล่าวถึงหรือ[ @implementationคุณไม่ต้องการให้คำถามนี้แสดงขึ้นสำหรับแบบสอบถามทั่วไปของ ObjC ใน Google มันควรจะปรากฏเฉพาะเมื่อมีคนถามobjc literalซึ่งเกิดขึ้นในปัจจุบัน (ขอบคุณชื่อและแท็ก)
Pooria Azimi

4
ตอนนี้เรียกว่าคำตอบ StackOverflow งานที่ดี Pooria
Nitish

15

คอมไพเลอร์ Objective-C มีความรู้ฮาร์ดโค้ดเกี่ยวกับโครงร่างหน่วยความจำของอินสแตนซ์ของNSConstantStringคลาสหรือที่รู้จักใน__CFConstantStringคลาส ตรวจสอบRewriteObjCStringLiteralฟังก์ชั่นในlib/Rewrite/RewriteModernObjC.cppรหัสที่มาเสียงดังกราว คอมไพเลอร์ก็ปล่อยข้อมูลที่ตรงกับเค้าโครงของอินสแตนซ์ของNSConstantStringคลาส

มีความเป็นไปได้สองสามอย่างสำหรับตัวอักษรNSArrayและNSDictionaryอินสแตนซ์ พวกเขาสามารถทำบางสิ่งเช่นสิ่งที่พวกเขาทำสำหรับสตริงตัวอักษรฮาร์ดโค้ดเลย์เอาต์อินสแตนซ์ (สำหรับคลาสย่อยพิเศษ) ในคอมไพเลอร์และปล่อยข้อมูลในโครงร่างนั้น หรือพวกเขาอาจมีรหัสปล่อยคอมไพเลอร์ที่เพียงแค่สร้างอินสแตนซ์ที่รันไทม์


2
การดำเนินงานของวัตถุไวยากรณ์ที่แท้จริงสำหรับNSArrayและค่อนข้างต่างจากNSDictionary NSStringคอมไพเลอร์เพียงแค่สร้างการเรียกไปยังNSDictionaryหรือNSArrayที่รันไทม์ นี่คือสาเหตุที่ตัวแปรโกลบอลไม่สามารถเริ่มต้นได้โดยใช้ไวยากรณ์นี้ (ไม่เหมือนNSString) สิ่งนี้จะต้องใช้ผลการรวบรวมเวลาคงที่
Buzzy

1

จาก“ ตัวอักษร C-Objective”

1) NSNumber, NSDictionaryและNSArrayตัวอักษรที่มีอยู่ในXcode 4.4

2) NSDictionaryและตัวNSArrayห้อยต้องการ " Xcode 4.4และOS X 10.8หรือใหม่กว่า SDK " หรือ " Xcode 4.5และiOS 6หรือSDK ใหม่กว่า "

หน้าตาผมชอบ subscripting ต้องการรันไทม์สนับสนุนและด้วยเหตุนี้จะไม่ทำงานก่อนiOS6


ในบทความเดียวกันมันบอกว่า "Deploys back to iOS 4" ในคอลัมน์ 'การปรับใช้ iOS'
code007

1
ฉันบังเอิญใช้ตัวอักษรแถวลำดับในโครงการที่ฉันรวบรวมด้วย Xcode 4.5 มันทำงานได้ดีบน iPad ที่ใช้ iOS5 มันไม่ได้รวบรวมใน Xcode 4.2 ซึ่งเป็นวิธีที่ฉันค้นพบว่าฉันทำมัน
JScarry

การสมัครสมาชิกสามารถทำงานกับ Xcode 4.4 และ iOS5 SDK ที่มาพร้อมกับถ้าคุณเพิ่มส่วนหัว: github.com/tewha/iOS-Subscripting/blob/master/ …
สตีเว่นฟิชเชอร์
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.