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
và __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 YES
và NO
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ư lvalue
và rvalue
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:
và 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)
.
Tin vui - cảm ơn bạn đã chia sẻ! – Till
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
Tôi phải nói một '@ nil' sẽ tốt cho' NSNull'. – Joe