문제

사전 배열이 있습니다.

키를 기준으로 배열을 필터링하고 싶습니다.

나는 이것을 시도했다 :

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(SPORT ==  %@)", @"Football"];

NSArray *filteredArray = [data filteredArrayUsingPredicate:predicate];

이것은 작동하지 않습니다. 결과가 없습니다. 내가 뭔가 잘못하고 있다고 생각합니다. 나는 이것이 "스포츠"가 IVAR 인 경우 방법이라는 것을 알고 있습니다. 그것이 열쇠라면 아마 다를 것이라고 생각합니다.

그러나 나는 예를 찾을 수 없었습니다.

감사


업데이트

내가 찾고있는 문자열 주위에 인용문을 추가했습니다.

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(SPORT ==  '%@')", @"Football"];

여전히 작동하지 않습니다.


업데이트 2

그것을 해결했습니다. 나는 실제로 단일 인용문을 제거해야했는데, 이는 가이드의 말에 반대하는 것 같습니다.

나의 진짜 문제는 내가 중첩 된 배열을 가지고 있었고 실제로 사전을 평가하지 않았다는 것입니다. 뼈 머리 움직임.

도움이 되었습니까?

해결책

데이터 변수가 실제로 키 스포츠와 함께 사전을 포함하는 배열 인 한 작동해야합니다.

NSArray *data = [NSArray arrayWithObject:[NSMutableDictionary dictionaryWithObject:@"foo" forKey:@"BAR"]];    
NSArray *filtered = [data filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"(BAR == %@)", @"foo"]];

이 경우 필터링되면 사전이 포함되어 있습니다.

( %@는 인용 할 필요가 없으며, NSPredicate가 객체를 생성 할 때 수행됩니다.)

다른 팁

나는 그것이 오래된 소식이지만 내 두 센트를 추가하는 것을 알고 있습니다. 기본적으로 명령을 사용합니다 LIKE[cd] 단지보다는 [c]. 그만큼 [d] 악센트 기호와 글자를 비교합니다. 이것은 사람들이 자신의 이름을 "vòódòó"라는 철자하는 내 워크래프트 앱에서 특히 잘 작동하여 테이블 뷰에서 자신의 이름을 검색하는 것이 거의 불가능합니다. 그만큼 [d] 술어 동안 악센트 기호를 벗겨냅니다. 그래서 술어 @"name LIKE[CD] %@", object.name 어디 object.name == @"voodoo" Vòódòó라는 이름이 포함 된 개체를 반환합니다.

Apple Documentation에서 : [CD]와 같이 "Case- 및 Diacritic-Insensitive Like"를 의미합니다.) String Syntax 및 사용 가능한 모든 연산자 목록에 대한 완전한 설명은 참조하십시오. 술어 형식 문자열 구문.

#import <Foundation/Foundation.h>
// clang -framework Foundation Siegfried.m 
    int
main() {
    NSArray *arr = @[
        @{@"1" : @"Fafner"},
        @{@"1" : @"Fasolt"}
    ];
    NSPredicate *p = [NSPredicate predicateWithFormat:
        @"SELF['1'] CONTAINS 'e'"];
    NSArray *res = [arr filteredArrayUsingPredicate:p];
    NSLog(@"Siegfried %@", res);
    return 0;
}

NSPredicate iPhone 3.0에서만 사용할 수 있습니다.

장치에서 실행하려고 할 때까지는 알 수 없습니다.

Swift 3을 사용하면 사전 키와 값을 기반으로 술어로 사전 배열을 필터링하려면 다음 패턴 중 하나를 선택할 수 있습니다.


#1. 사용 NSPredicate init(format:arguments:) 이니셜 라이저

Objective-C에서 온 경우 init(format:arguments:) 술어를 평가하기 위해 키 가치 코딩 스타일을 제공합니다.

용법:

import Foundation

let array = [["key1": "value1", "key2": "value2"], ["key1": "value3"], ["key3": "value4"]]

let predicate = NSPredicate(format: "key1 == %@", "value1")
//let predicate = NSPredicate(format: "self['key1'] == %@", "value1") // also works
let filteredArray = array.filter(predicate.evaluate)

print(filteredArray) // prints: [["key2": "value2", "key1": "value1"]]

#2. 사용 NSPredicate init(block:) 이니셜 라이저

원하는 경우 대안으로 강력하게 입력했습니다 Apis Over 끈적 끈적한 입력 API, 사용할 수 있습니다 init(block:) 이니셜 라이저.

용법:

import Foundation

let array = [["key1": "value1", "key2": "value2"], ["key1": "value3"], ["key3": "value4"]]

let dictPredicate = NSPredicate(block: { (obj, _) in
    guard let dict = obj as? [String: String], let value = dict["key1"] else { return false }
    return value == "value1"
})

let filteredArray = array.filter(dictPredicate.evaluate)
print(filteredArray) // prints: [["key2": "value2", "key1": "value1"]]

보고 nspredicate 참조, 그것은 당신이 대체 문자를 인용문으로 둘러싸고있는 것처럼 보입니다. 예를 들어, 현재의 술어는 다음과 같습니다. (SPORT == Football) 당신은 그것을 읽기를 원합니다 (SPORT == 'Football'), 형식 문자열이어야합니다 @"(SPORT == '%@')".

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top