for 루프를 통해 NSDictionary를 반복하려고합니다. 그러나 나는이 컬렉션의 끝에서 시작까지 iteration을 반복하기를 원합니다. 이 복귀를 어떻게 구현할 수 있습니까?처음부터 컬렉션의 끝에서 Objective-C의 for-in 루프를 구현하는 방법은 무엇입니까?
1
A
답변
5
음 ... 문제는 NSDictionary와 자연에 의해 순서가 있다는 것입니다.
그래서 가능한 해결책은 "reverseObjectEnumerator"를 사용하여 해당 배열을 역순으로 배열 한 다음 배열에 루프를 만들고 사전에 키를 사용하여 키를 사용하여 NSArray를 만드는 것입니다. 이 같은
뭔가 :
NSDictionary *_dict = [NSDictionary dictionaryWithObjectsAndKeys:
@"firstValue",@"firstKey",
@"secondValue",@"secondKey",
@"thirdValue",@"thirdKey",
nil];
NSArray *keysNormal = [_dict allKeys];
NSArray *keysReversed = [[[_dict allKeys] reverseObjectEnumerator] allObjects];
for(NSString *str in keysNormal)
{
NSLog(@"%@", [_dict objectForKey:str]);
}
for(NSString *str in keysReversed)
{
NSLog(@"%@", [_dict objectForKey:str]);
}
로그는 다음과 같습니다
- thirdValue
- secondValue
- firstValue
- firstValue
- secondValue
- thirdValue
7
NSDictionary
은 정렬되지 않은 데이터 구조입니다. forward iteration이나 backward iteration의 개념은 없습니다.
foreach 루프에서 NSDictionary를 호출하면 정렬되지 않은 키 목록을 반복합니다. 순서가없는 목록을 반복 할 때 순서는 정의되지 않으므로 순서가 바뀝니다. 카드 더미를 바닥에 흩 뜨린 다음 누군가에게 주문을 취소하도록 요청하는 것과 비슷합니다.
키 (숫자, 알파벳순 등)에 순서 계층 구조가 있다고 가정하면 대신 키 컬렉션을 가져 와서 특정 순서로 정렬 한 다음 키 컬렉션을 반복하거나 역순으로 반복 할 수 있습니다. 그러나 이것이 자주 수행하는 작업 인 경우 NSDictionary
이 문제의 데이터 구조에 최상의 선택이 아니라고 생각됩니다.
1
NSArray * a = @[@"a",@"b",@"c"];
NSArray * b = [[a reverseObjectEnumerator] allObjects];
for (NSString * obj in b) {
NSLog(@"%@",obj);
}
인쇄 c, b, a. 이처럼 사전의 키를 반전하려고 :
NSArray * key = [[[dict allKeys] reverseObjectEnumerator] allObjects];
확인. 하지만 동적으로 데이터를 추가 할 때 (JSON의 메시지 흐름), 내가 추가 한 순서대로 나타납니다. 따라서 NSDictionary를 반복하고 특정 플래그가있는 마지막 메시지 구조를 1로 설정하는 방법을 원합니다. 그래서 끝에서부터 반복해야합니다. 아니면 좀 더 논리적 인 방법이있을 수 있습니다 - 저는 Objective-C 세계를 초보자입니다. – MainstreamDeveloper00
순서가 정의되지 않은 경우 NSDictionary에 삽입 된 마지막 요소 인 Key 컬렉션의 마지막 키를 기대할 수 없습니다. 플래그가 1로 설정된 마지막 메시지가 필요하다는 것을 알고 있으면 각 메시지가 들어올 때마다 확인할 수 있으며 플래그가 1로 설정되어 있으면 NSDictionary 외에 누군가를 저장합니까? 그런 식으로'Flag = 1'을 사용하여 항상 마지막 메시지에 빠르게 접근 할 수 있습니다. – Alan