我可以创建一个在NSMutableSet中使用的自定义对象吗?

时间:2013-01-12 08:59:15

标签: ios objective-c nsmutabledictionary nsmutableset

我是Objective-C的新手,所以请耐心等待。我需要创建一个名称=值对的数组(或一组),其中一个条件名称可以在集合中重复(因此我不能使用NSMutableDictionary。)我发现NSMutableSet似乎是我需要的,但是我的困境现在是如何在其中添加两个NSString对象?

4 个答案:

答案 0 :(得分:1)

您仍然可以使用字典,但对于值,请使用数组或集合。这样,您可以将相同的键映射到多个不同的值。

答案 1 :(得分:1)

我不会使用一个集合,我认为您仍然应该使用NSMutableDictionary,因为问题的根源是基于密钥的查找。

您要做的是将NSMutableArray作为'值',将名称作为键。如果尚未使用该密钥,请在字典中使用第一个值创建NSMutableArray。如果已经使用了密钥,只需将值添加到字典内的NSMutableArray

以下是“setValueForKey”方法的一些示例代码:

NSMutableDictionary *dictionary = /* Some mutable dictionary stored as an instance variable or similar */
NSString *keyToAdd; id valueToAdd;

NSMutableArray *arrayForKey = [dictionary objectForKey:keyToAdd];

if (arrayForKey != nil) { // if the array has been created before earlier in the program
    [arrayForKey addObject:valueToAdd]; // then just add the value directly to the array inside the dictionary
} else { // otherwise create the mutable array using the key
    NSMutableArray *newMutableArray = [[NSMutableArray alloc] initWithCapacity:0];

    [dictionary setObject:newMutableArray forKey:keyToAdd];

    [newMutableArray addObject:valueToAdd];
}

要实现此逻辑,从技术上讲,您可以创建NSDictionary的子类,但我认为自定义包装器对象在语义上会更好。

答案 2 :(得分:1)

您可能无法使用NSMutableSet,因为集合通过散列进行单独处理。如果你有两个具有相同哈希值的对象(比如两个具有相同字符的NSStrings),那么你最终只能在集合中使用一个字符串。

您可能希望使用NSMutableArray,其中放置一个具有key属性和指向实际对象的value属性的对象。或者,您可以自己在NSArray中获取值,如果要查找某个值,可以遍历数组并获取具有匹配键的对象。或者更优雅地使用NSPredicate按键过滤数组。

有关如何使用谓词过滤数组,请参阅此处:http://www.cocoanetics.com/2010/03/filtering-fun-with-predicates/

答案 3 :(得分:0)

你应该选择NSDictionary,因为它是哈希映射的并且更快。您可以创建具有array类型属性的自定义类。将所有值存储在那里并将该对象用作值并放入一个键。