Các chi tiết của các mục tiêu của Cive Objective-C được đề cập trong các ghi chú phát hành Xcode 4.4 là gì?


188

Tôi đã xem qua các ghi chú phát hành cho Xcode 4.4 và nhận thấy điều này:

Trình biên dịch LLVM 4.0

Xcode hiện bao gồm Trình biên dịch LLVM của Apple phiên bản 4.0, bao gồm các tính năng ngôn ngữ newObjective-C sau: [...]
- Các ký tự Objective-C: tạo các chữ cho NSArray, NSDipedia và NSNumber, giống như các chữ cho NSString

Tôi tò mò về tính năng này. Nó không hoàn toàn rõ ràng với tôi như thế nào literals cho NSStringcông việc và làm thế nào người ta có thể sử dụng chúng trên NSArray, NSDictionaryNSNumber.

Các chi tiết là gì?


Không phải là một câu trả lời, nhưng có một số suy đoán ở đây: reddit.com/r/programming/comments/pso6x/xcode_43_release/
Kẻ

3
"Không phải tài liệu này là đối tượng của NDA sao?" Và vấn đề của bạn là gì?
Hejazzman

7
Không, Apple đã tuyên bố rõ ràng rằng những bổ sung này không phải là NDA trong danh sách gửi thư.
Griotspeak

2
LLVM có một vài tài liệu về điều này: clang.llvm.org/docs/L LanguageExtensions.html#objc_lambdas
Steven Kramer

3
Dưới đây là một liên kết trực tiếp đến các cuộc thảo luận Clang của literals Objective-C: clang.llvm.org/docs/ObjectiveCLiterals.html
ThomasW

Câu trả lời:


393

Nguyên văn được sao chép từ http://cocoaheads.tumblr.com/post/17757846453/objective-c-literals-for-nsdipedia-nsarray-and :

Nghĩa đen của Objective-C: giờ đây người ta có thể tạo ra các chữ cho NSArray, NSDipedia và NSNumber (giống như người ta có thể tạo ra các chữ cho NSString)

NSArray

Trước đây:

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

Hiện nay:

array = @[ a, b, c ];

Văn học NSDixi

Trước đây:

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

Hiện nay:

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

NSNumber

Trước đây:

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

Hiện nay:

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

[Biên tập]

zxoq tại http://news.ycombinator.com/item?id=3672744 đã thêm đăng ký mới thú vị hơn. (Đã thêm bằng chữ):

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

[Chỉnh sửa 2]

Các chữ ObjC mới đã được thảo luận trong nhiều phiên WWDC 2012 . Tôi cố tình không xóa tên tệp và thời gian của mỗi slide để bạn có thể tự tìm chúng nếu bạn muốn. Chúng cơ bản giống như đã nêu trong bài đăng này, nhưng cũng có một vài điều mới mà tôi sẽ đề cập ở trên các hình ảnh.

Xin lưu ý rằng hình ảnh là tất cả lớn. Chỉ cần kéo chúng vào một tab khác để xem chúng ở kích thước ban đầu của chúng

Văn học & Quyền anh

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

Văn học & Quyền anh

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

Thu thập đăng ký

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

Thu thập đăng ký

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

@ # số, @ {} từ điển, chuỗi @ "", mảng @ [], biểu thức @ ()


Phần này là mới. Biểu hiện văn học

Khi bạn có một biểu thức ( M_PI / 16ví dụ), bạn nên đặt nó trong ngoặc đơn.

Cú pháp này hoạt động cho các biểu thức số, booleans, tìm chỉ mục trong chuỗi (C-), giá trị boolean, hằng số enum và thậm chí cả chuỗi ký tự!

Biểu hiện văn họ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")];

Biểu hiện văn học

NSNumber *piOverSixteen = @( M_PI / 16 );

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

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

NSNumber *writingDirection = @( NSWritingDirectionLeftToRight );

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

Tìm hiểu thêm về chuỗi ký tự và cách / khi bạn có thể sử dụng cú pháp bằng chữ này:

Biểu thức chuỗi đóng hộp

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

Biểu thức chuỗi đóng hộp

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

Làm thế nào mảng chữ hoạt động

Làm thế nào mảng chữ hoạt động

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

Làm thế nào từ điển chữ

Làm thế nào từ điển chữ

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

Thêm về đăng ký mảng

Đăng ký mảng

@implementation SongList {
    NSMutableArray *_songs;
}

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

Đăng ký mảng

@implementation SongList {
    NSMutableArray *_songs;
}

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

Thêm về đăng ký từ điển

Đăng ký từ điển

@implementation Database {
    NSMutableDictionary *_storage;
}

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

Đăng ký từ điển

@implementation Database {
    NSMutableDictionary *_storage;
}

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

[Chỉnh sửa 3]

Mike Ash có một bài viết tuyệt vời về những tác phẩm mới này. Nếu bạn muốn biết thêm về công cụ này, hãy chắc chắn kiểm tra nó .



9
Tôi có thể thấy điều này tăng tốc mã hóa của tôi!
Pedro Mancheno

12
Có cách nào để có xCode 4.3 để hỗ trợ các ký hiệu mới này không? Tôi muốn họ - BÂY GIỜ ... nhưng đang SO không "đi lên núi" cho họ ...
Alex Grey

20
Bạn có rất nhiều nội dung văn bản được nhúng trong hình ảnh ở đây mà công cụ tìm kiếm sẽ dễ tìm thấy hơn nếu nó được đăng dưới dạng văn bản thuần túy.
Bill Lizard

5
@BilltheLizard Tôi không đồng ý. Hầu hết các bài kiểm tra là những thứ không thể tìm kiếm như {[, hoặc là những từ chung chung như array, id@implementation. Các từ khóa có liên quan là literal, objcxcode, không phải là đề cập cụ thể của [hoặc @implementation. Bạn không muốn câu hỏi này hiển thị cho các truy vấn ObjC chung trên Google, câu hỏi này chỉ được hiển thị khi có ai đó truy vấn objc literal, hiện tại xảy ra (nhờ tiêu đề và thẻ).
Pooria Azimi

4
Bây giờ được gọi là câu trả lời StackOverflow. Công việc tốt Pooria.
Nitish

15

Trình biên dịch Objective-C có kiến ​​thức được mã hóa cứng về cách bố trí bộ nhớ của các thể hiện của NSConstantStringlớp, hay còn gọi là __CFConstantStringlớp. Kiểm tra RewriteObjCStringLiteralchức năng trong lib/Rewrite/RewriteModernObjC.cppmã nguồn clang. Trình biên dịch chỉ đơn giản là phát ra dữ liệu phù hợp với cách bố trí các thể hiện của NSConstantStringlớp.

Có một vài khả năng cho nghĩa đen NSArrayNSDictionarytrường hợp. Họ có thể làm một cái gì đó giống như những gì họ đã làm cho chuỗi ký tự - mã hóa bố cục cá thể (đối với một lớp con đặc biệt) trong trình biên dịch và phát ra dữ liệu trong bố cục đó. Hoặc họ có thể có trình biên dịch phát ra mã mà chỉ cần tạo một cá thể trong thời gian chạy.


2
Việc thực hiện cú pháp đối tượng theo nghĩa đen NSArrayNSDictionarykhá không giống với NSString. Trình biên dịch chỉ đơn giản là tạo một cuộc gọi đến NSDictionaryhoặc NSArraytrong thời gian chạy. Đây cũng là lý do tại sao các biến toàn cục không thể được khởi tạo bằng cú pháp này (không giống như NSString). Điều này sẽ yêu cầu kết quả là một hằng số thời gian biên dịch.
Buzzy

1

Từ văn học Mục tiêu-C

1) NSNumber, NSDictionaryNSArraychữ có sẵn trong Xcode 4.4 .

2) NSDictionaryNSArrayđăng ký cần " SDK Xcode 4.4OS X 10.8 trở lên " hoặc " Xcode 4.5SDK iOS 6 trở lên "

Có vẻ như tôi đăng ký cần hỗ trợ thời gian chạy và do đó sẽ không hoạt động trước iOS6 .


trong cùng một bài viết có ghi "Triển khai trở lại iOS 4" trong cột 'Triển khai iOS'
mã007

1
Tôi đã vô tình sử dụng mảng chữ trong một dự án mà tôi đã biên dịch bằng Xcode 4.5. Nó chạy tốt trên iPad chạy iOS5. Nó không biên dịch trên Xcode 4.2, đó là cách tôi phát hiện ra rằng tôi đã làm nó.
JScarry

Việc đăng ký có thể được thực hiện để hoạt động với Xcode 4.4 và SDK iOS5 mà nó đi kèm nếu bạn thêm tiêu đề: github.com/tewha/iOS-Subcripting/blob/master/iêu
Steven Fisher
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.