2012-03-13 21 views

Trả lời

88

Với this change đến codebase LLVM, Apple đã bổ sung thêm một cú pháp mới cho literals trong các phiên bản sắp tới của trình biên dịch Clang.

Trước đây, mảng được tạo ra sử dụng một mảng C-based và được chuyển đổi một cách nhanh chóng vào-C Mục tiêu đối tượng, chẳng hạn như:

NSArray* array = [NSArray arrayWithObjects: @"One", @"Two", @"Three", nil]; 

Lưu ý rằng vì đây là một yếu tố varargs, bạn phải cung cấp một kết thúc 'nil' ở cuối danh sách. Tuy nhiên, bây giờ có một cách dễ dàng hơn:

NSArray* array = @[ @"One", @"Two", @"Three" ]; 

Lưu ý rằng hàng đầu @ trước khi [] được yêu cầu, để phân biệt giữa nó và một mảng C thông thường (hoặc gửi thư). Cũng lưu ý rằng dấu 'nil' không còn cần thiết nữa.

Một sự thay đổi tương tự đã được thực hiện tại dòng chữ từ điển, tương tự như cấu trúc JSON:

NSDictionary* dict = @{ 
    @"Key1": @"Value1", 
    @"Key2": @"Value2", 
}; 

Cuối cùng, một chữ mới cho NSInteger (vv) đã được thêm vào:

NSNumber* value = @3.141; 

Lưu ý rằng mặc dù điều này làm việc cho điểm nổi (@3.141F) và tăng gấp đôi (@3.141) nó không hoạt động cho long double s vì chúng không được hỗ trợ để gói bởi trình biên dịch. Do đó, @3.141D sẽ là lỗi biên dịch.

Do cách xác định các hằng số, @INT_MAX là giá trị hợp lệ nhưng @INT_MIN không phải vì giá trị sau được xác định thông qua biểu thức biên dịch và không phải là chữ.

Ngoài ra còn có phần mở rộng với các loại boolean:

NSNumber* yes = @YES;   // [NSNumber numberWithBool:YES] 
NSNumber* no = @NO;   // [NSNumber numberWithBool:NO] 
NSNumber* trueBool = @true; // [NSNumber numberWithBool:(BOOL)true] 
NSNumber* falseBool = @false; // [NSNumber numberWithBool:(BOOL)false] 

Sự thay đổi này cũng đã giới thiệu __objc_yes__objc_no literals để hỗ trợ việc phân tích các loại qua chỉ có giá trị văn chương. Việc sử dụng chúng được bảo vệ với #if __has_feature(objc_bool) trong bộ tiền xử lý, nhưng các nhà phát triển nên tiếp tục sử dụng YESNO trong mã.

Cuối cùng, cả hai mảng và từ điển bây giờ có thể được subscripted với dấu ngoặc mảng, sử dụng cả hai như lvaluervalue biểu:

NSMutableArray* stuff = ... 
id first = stuff[0]; 
stuff[0] = anotherObject; 

NSMutableDictionary* moreStuff = ... 
id conference = moreStuff[@"NSConf"] 
moreStuff[@"SponsoredBy"] = @"NSConfDuck" 

Phong cách mảng subscripting (sử dụng một NSUInteger) được ánh xạ tới objectAtIndexedSubscript: và tương ứng setObject:atIndexedSubscript:, trong khi truy cập từ điển được truy cập với objectForKeyedSubscript:setObject:forKeyedSubscript:

Cú pháp đầy đủ cho các chữ có thể được xem tại Clang/LLVM website

Lưu ý rằng kể từ khi câu trả lời này ban đầu được viết tay, Clang đã thêm hỗ trợ cho các biểu thức Objective-C phi đen gọi là 'đóng hộp biểu'

Điều này có nghĩa rằng người ta có thể sử dụng @(3+4) như tương đương với @7, và @("Hello World") như @"Hello World". Lưu ý rằng biểu thức C đánh giá là null sẽ dẫn đến ngoại lệ và các đối số như @(null) được coi là lỗi biên dịch.

Nó cũng có thể sử dụng 'enums Đóng hộp' với nhiều loại với một loại nổi tiếng, vì vậy

enum { Bắc, Nam, Đông, Tây, };

có thể được đặt vào loại enum được đóng hộp với @(North), giá trị này sẽ có giá trị 0.

Các biểu thức được đóng hộp sẽ khả dụng trong clang 3.2 trở đi. Nó có thể được kiểm tra để sử dụng kiểm tra tiền xử lý __has_feature(objc_boxed_expressions).

+2

Tin vui - cảm ơn bạn đã chia sẻ! – Till

+0

Hiện tại, cũng có các biểu thức được tự động hóa, được tạo sau khi câu trả lời này được xuất bản lần đầu tiên. Tôi đã sửa đổi danh sách ở trên để bao gồm một số ví dụ về điều đó. – AlBlue

+2

Tôi phải nói một '@ nil' sẽ tốt cho' NSNull'. – Joe

Các vấn đề liên quan