2013-02-05 25 views
23

thể trùng lặp:
Is there some literal dictionary or array syntax in Objective-C?NSArray objectAtIndex: viết tắt

Gần đây tôi đã nhận thấy rằng một cái gì đó kỳ lạ dường như làm việc trong Objective-C.

Khi tôi có một mảng,

NSArray *myArray = @[@"1", @"b", @"3", @"d"]; 

Tôi thường có thể truy cập vào phần tử thứ hai bằng,

NSString *element = [myArray objectAtIndex:1]; // second element 

tuy nhiên tôi dường như bây giờ cũng có thể truy cập nó thông qua.

NSString *element = myArray[1]; 

Có ai biết đây là hành vi được xác định và do đó an toàn để sử dụng hay tôi nên tránh nó? Cám ơn bất cứ ai có thể giúp đỡ!!

+0

Rất tiếc, không chắc chắn cách tìm kiếm. –

+0

Cảm ơn mọi người vì câu trả lời của bạn !! :) –

Trả lời

28

Cú pháp này được thêm vào Clang 3.3: Objective C Literals. Về cơ bản, trình biên dịch chuyển đổi các biểu thức của loại objCObj[idx] thành biểu thức [objCObj objectAtIndexedSubscript:idx]. Nó cũng làm việc cho các từ điển, và bạn tự do áp dụng nó cho các đối tượng của riêng bạn.

Như vậy, bạn hoàn toàn an toàn khi sử dụng nó, giả sử bạn sẽ sử dụng phiên bản Objective C hiện đại và trình biên dịch Objective C được cập nhật phù hợp (ví dụ: Clang).

+0

Apple đã thực hiện một mess ra khỏi viết tắt .. Điều gì xảy ra với * "nếu nó không bị hỏng, không sửa chữa nó" *? – Jacksonkr

4

đây là một tính năng mới của Objective-C và avaiable từ Xcode 4.5

an toàn để sử dụng cú pháp này, bạn thậm chí có thể cung cấp cho lớp học của riêng bạn của nó hỗ trợ cho việc này.

2

Ya, bạn có thể sử dụng cú pháp này an toàn.

Cú pháp đó là một phần của Mục tiêu hiện đại-C.

Bạn có thể kiểm tra bài viết này cho nhiều lựa chọn hơn: ObjectiveCLiterals

2

Đó là một mã hoàn toàn hợp lệ cho phiên bản mới nhất của trình biên dịch LLVM. Cho đến nay, nó không hợp lệ đối với các trình biên dịch khác (ví dụ GCC).

Bạn có nên tránh nó hay không - tốt, đó là vấn đề về hương vị. Có một số cuộc thảo luận lớn về nó trên internet kể từ khi lập chỉ mục hoạt động hơi khác nhau (một phương pháp hoàn toàn khác nhau được sử dụng để thực hiện nó). Cũng có các cuộc thảo luận về việc sử dụng các biểu thức hay không vì có các ocassion khi chúng làm cho mã ít đọc được hơn (ví dụ chúng được viết như literals nhưng chúng thực sự là các đối tượng tự động). Lưu ý rằng tất cả mọi thứ được thực hiện bằng cách sử dụng literals có thể được thực hiện bằng cách sử dụng macro đơn giản.