【发布时间】:2013-08-06 22:53:06
【问题描述】:
我知道在 stackoverflow 中已经提出并回答了一大堆问题,这些问题涉及通过将 NSDictionary 中的键按数组中的排序顺序进行排序的挑战。我知道对象在实际字典中不是按排序顺序存储的,也就是说,我认为是出于效率的原因,或者可能是 Foundation 代码的内存管理。
我一直在尝试从这里以及苹果文档和博客中的几个答案中尝试示例(有些我可以开始工作,有些则不行!),但我似乎找不到解决我困惑的示例。
我认为我的困惑是我在这里遇到的例子,在苹果文档和不同有用的博客中,似乎都有只有一个键值对而第二个值不是对象的例子 -它更像是一个值。 (但它在某种程度上真的不是一个对象吗?我认为它是)
一个例子,我无法上班 (Sorting an NSArray by an NSDictionary value) 就是使用这个想法
[array sortedArrayUsingComparator:^(NSDictionary *item1, NSDictionary *item2) {
NSString *age1 = [item1 objectForKey:@"age"];
NSString *age2 = [item2 objectForKey:@"age"];
return [age1 compare:age2 options:NSNumericSearch];
}];
我想也许这个想法,以更具体的方式指定密钥,可能是我的问题。
我想知道我是否没有向编译器传达密钥是什么以及对象是什么,这就是为什么我收到“无法识别的选择器发送到实例”错误的原因。
.....代码片段跟随.....
1) 我有一个班级叫“狗”。一个给定的 dog 对象有几个属性,包括一个 NSString 键。
我的键是“licenseString”是一个字母数字键 - 我也想知道我是否应该使用 decimalNumberWithString 但这不是这里的问题
@property (strong,nonatomic) NSString *licenseString;
@property (strong, nonatomic) NSString *dogName;
@property (strong, nonatomic) NSString *whatMakesDogSpecial;
@property (strong, nonatomic) UIImage *dogPhoto;
2) 我有一个 NSDictionary @property (nonatomic, strong) NSDictionary *dogDictionary;
我以这种不太复杂的方式将信息硬编码到 dogDictionary 中,
Dog *aDog;
// Dog one
aDog = [[Dog alloc]init] ;
aDog.licenseString = @"1";
aDog.dogName = @"Oscar";
aDog.whatMakesDogSpecial = @"This animal was found at the Mid-Penn humane society. He is super friendly, plays well with other dogs and likes people too. He enjoys fetching balls and frisbees too. He also goes to the park daily." ;
aDog.dogPhoto = [UIImage imageNamed:@"webVuMiniAppDogOscar.jpg"];
[self.dogDictionary setValue:aDog forKey:aDog.licenseString];
3) 然后,一旦我的 dogDictionary 中有几个狗对象,我想对许可证标签值进行排序,这样我就可以用狗名填充表格视图,但要按照它们的许可证标签的顺序。
顺便说一句,编译器似乎确实识别了下面代码片段中出现的“vars.dogDictionary”,因为当我查看调试器时,我可以看到我的狗字典中出现了两个有效实例。调试器输出在附件中
所以,我使用来自 stackoverflow 答案和苹果文档的想法,写了这个
NSArray *sortedKeys = [vars.dogDictionary keysSortedByValueUsingComparator:
^NSComparisonResult(id obj1, id obj2) {
return [obj1 compare:obj2];
}];
NSLog(@" The sorted array is %@", sortedKeys);
这就是我的问题发生的地方。我知道 0x1182f740 指的是“obj1”,如调试器附件所示
2013-08-06 15:13:58.276 SortDogLIcenseTags[3876:11303] -[Dog compare:]:无法识别的选择器发送到实例 0x1182f740 (lldb)
附件是显示调试器值的图片 - 他们不喜欢很好地粘贴
【问题讨论】:
-
不是 Xcode 问题。 -- 至于实际问题:google 错误消息,“无法识别的选择器”是 Objective-C 程序可能崩溃的最常见(如果不是最常见)原因之一。基本上,您必须在
Dog类上实现compare:。 -
你想要一个排序的键数组(licenseStrings)吗?还是一组排序好的狗(按 licenseString 排序)?另外,
vars是什么? -
谢谢。当您说这不是 Xcode 问题时,我应该如何标记它? IOS?目标-C?我将尝试弄清楚如何在我的班级上实施比较。我想这就是我从各种来源使用的示例之间的区别吗?他们来自的班级已经有了? ....我在想我想要一个排序的键数组 - 许可证字符串,然后我会根据键从我的字典中选择狗对象,当我去填充用户选择的主表视图时。然而,一组排序好的狗可能也很适合知道如何做
-
您应该对 NSString 值进行排序,而不是数组中的对象。此外,您的 NSString 和 NSDictionary 属性是错误的,它们需要是“复制”属性而不是“保留”,这是强默认的。
-
顺便说一句,我没有在我的狗类上实现比较。我想要的排序数组是按键。对不起,我对 vars 的解释不清楚。 Vars 是指我保存所有应用程序数据的类,例如公司数据源。我再次知道这不是最复杂的方法。
标签: sorting nsdictionary selector