关于NSDictionary的NSPredicate

sim*_*nbs 9 iphone objective-c nsdictionary nspredicate

我正在尝试根据字母表在表格视图中创建部分,并在这些部分下按字母顺序对我的条目进行排序.

我收集了bandArray中bandArrayIndex的每个条目中的第一个字母,我现在正在尝试使用NSPredicate来计算每个字母的数量.

我按照本指南这样做了.

他们正在使用NSArray而我正在使用NSDictionary,似乎无法让它工作.谁能帮我吗?

尝试使用表视图显示视图时,应用程序崩溃.在Debugger Console中,显示以下错误:

*由于未捕获的异常'NSInvalidArgumentException'终止应用程序,原因:'无法使用非字符串的内容执行子字符串操作

这是我的代码

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    NSString *alphabet = [bandsArrayIndex objectAtIndex:section];
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF beginswith[c] %@", alphabet];
    NSArray *letters = [bandsArray filteredArrayUsingPredicate:predicate];

    return [letters count];
}
Run Code Online (Sandbox Code Playgroud)

编辑:这是我的bandArray.

标题

NSMutableArray *bandsArray;

@property (nonatomic, retain) NSMutableArray* bandsArray;
Run Code Online (Sandbox Code Playgroud)

实施

// set array from plist
NSString *path = [[NSBundle mainBundle] pathForResource:@"Bands" ofType:@"plist"];
NSMutableArray* tmpArray = [[NSMutableArray alloc] initWithContentsOfFile:path];

self.bandsArray = tmpArray;

// sort array after name ascending
NSSortDescriptor *nameSorter = [[NSSortDescriptor alloc] initWithKey:@"name" ascending:YES selector:@selector(caseInsensitiveCompare:)];
[bandsArray sortUsingDescriptors:[NSArray arrayWithObject:nameSorter]];
Run Code Online (Sandbox Code Playgroud)

Dan*_*son 22

你的意思是那bandsArray是一系列词典吗?如果是这样,并假设每个字典都有一个name键,你应该能够将谓词更改为类似的@"SELF.name beginswith[c] %@".

另一方面,如果bandsArray实际上是字典本身,也许你想做[[bandsArray allKeys] filteredArrayUsingPredicate...].


Isa*_*sky 6

#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;
}
Run Code Online (Sandbox Code Playgroud)