2010-04-22 29 views

Trả lời

58

Không có phần tử "đầu tiên" trong từ điển NSDictionary; các thành viên của nó không có thứ tự được bảo đảm. Nếu bạn chỉ muốn một đối tượng từ một cuốn từ điển, nhưng không quan tâm mà chính nó liên kết với, bạn có thể làm:

id val = nil; 
NSArray *values = [yourDict allValues]; 

if ([values count] != 0) 
    val = [values objectAtIndex:0]; 
+0

id val = nil; ?? – lajarre

+1

Có, vì vậy bạn vẫn có thể nhắn 'val' mà không bị lỗi nếu' [giá trị đếm] 'bằng không. – Wevah

+3

Xin lưu ý rằng phương thức '' 'allValues''' trả về mảng không có thứ tự. Theo tài liệu "Thứ tự của các giá trị trong mảng không được xác định". Vì vậy, bạn có thể không nhận được đối tượng bạn đang mong đợi để có được. –

25

NSDictionaries là không có thứ tự, có nghĩa là không có yếu tố đầu tiên hoặc cuối cùng. Trong thực tế, thứ tự của các phím không bao giờ được bảo đảm giống nhau, ngay cả trong thời gian tồn tại của một từ điển cụ thể.

Nếu bạn muốn bất kỳ đối tượng, bạn có thể nhận được một trong các phím:

id key = [[message allKeys] objectAtIndex:0]; // Assumes 'message' is not empty 
id object = [message objectForKey:key]; 
+0

Cảm ơn - điều này có ý nghĩa. – Ronaldoh1

0

Nếu bạn có NSDictionary tên nhắn, Nó khá đơn giản:

message[[[message allKeys] objectAtIndex:0]]; 

Nhưng bạn phải chắc chắn (hoặc kiểm tra tốt hơn) rằng từ điển của bạn có ít nhất một phần tử. Đây là cách bạn có thể kiểm tra xem nó:

if ([message allKeys] > 0) NSLog(@"%@", message[[[message allKeys] objectAtIndex:0]]); 

Nhưng NSDictionary không có trật tự đảm bảo, vì vậy có lẽ bạn nên sử dụng mã này chỉ nếu từ điển của bạn chỉ có một phần tử.

[UPDATE] Nó cũng ý tưởng tốt để sử dụng này nếu bạn cần để có được bất kỳ yếu tố của từ điển

-2

Hãy thử điều này:

NSDictionary *firstValue = [responseObject objectAtIndex:0]; 
1

Theo Apple, các cuộc gọi đến allKeys hoặc allValues phải chịu chi phí tạo mảng mới:

Mảng mới chứa giá trị của từ điển hoặc một mảng trống nếu điển không có bài (read-only)

Vì vậy, một lựa chọn thay thế mà không phải chịu chi phí như vậy có thể trông như thế này:

NSString* key = nil; 
for(key in yourDict) 
{ // this loop will not execute if the dictionary is empty 
    break; // exit loop as soon as we enter it (key will be set to some key) 
} 
id object = yourDict[key]; // get object associated with key. nil if key doesn't exist. 

Lưu ý: Nếu từ điển rỗng, chìa khóa sẽ giữ nguyên, và đối tượng được trả về cũng sẽ là 0, do đó chúng ta không cần xử lý đặc biệt đối với trường hợp từ điển thực sự trống.

+0

Nói chung tôi ưu tiên khả năng đọc qua bộ nhớ tốc độ/tiết kiệm –

1

Nếu ai đó vẫn đang tìm kiếm câu trả lời cho loại tình huống này sau đó có thể tham khảo này:

// dict là NSDictionary

// [allKeys dict] sẽ cung cấp cho tất cả các phím trong dict hiện

// [[dict allKeys] objectAtIndex: 0] sẽ cung cấp từ tất cả các đối tượng khóa tại chỉ mục 0 vì [dict allKeys] trả về một mảng.

[[dict allKeys]objectAtIndex:0]; 
4

NSArray có một chọn tên firstObject mà đơn giản hoá mã và làm cho nó dễ đọc hơn:

id val = [[yourDict allValues] firstObject]; 

Nếu yourDict trống val sẽ nil, vì vậy không cần thiết phải kiểm tra từ điển/size mảng .

+1

Trong khi đó là sự thật và lưu một hoặc hai dòng mã, câu hỏi là về 'NSDictionary', không phải' NSArray'. – trojanfoe

+0

Có và là giá trị "đầu tiên" của từ điển bạn nhận được với mã này. Chỉ là nó sử dụng một chuyển đổi mảng, giống như hầu như tất cả các câu trả lời khác. – ASLLOP

+0

Không có từ "đầu tiên" với từ điển vì nó không có thứ tự. Bạn sẽ có khả năng nhận được một "đầu tiên" khác nhau mỗi khi bạn thêm một đối tượng vào từ điển. – trojanfoe

1

đơn giản nhất:

[[dict objectEnumerator] nextObject]; 
Các vấn đề liên quan