为什么[NSSet allObjects]没有返回集

时间:2016-02-26 00:46:26

标签: objective-c nsarray nsset

我正在关注[NSManagedObject valueForKeyPath:...],然后检查查询返回的结果,看看它是单个NSManagedObject还是受管对象的NSSet。如果它是NSSet,我试图使用[NSSet allObjects]

将其转移到NSArray

它没有像预期的那样返回NSSet成员的NSArray。

  

guids = [结果allObjects]

result实际上是一个NSSet,但是它给了我一个包含NSSet的数组。

当我问数组中有多少个物体时,我得到'1'作为我的答案......

  

[guids count] //返回1

    NSArray *guids;

    id result = [someNSManagedObject valueForKeyPath:kvcPath];

    if ([result isKindOfClass:[NSSet class]])
    {
        guids = [result allObjects];
    }

enter image description here

即使用枚举器和NSMutableArray替换guids = [result allObjects]也不起作用......

    if ([result isKindOfClass:[NSSet class]])
    {
        NSEnumerator *setEnumerator = [result objectEnumerator];
        NSString *value;

        while (value = [setEnumerator nextObject]) {
            [guids addObject:value];
        }
    }

看下面的图片(搞笑),调查员应该从集合中查看单个值,但是它会将整个集合视为值。

enter image description here

1 个答案:

答案 0 :(得分:0)

在上面的评论中归功于 rmaddy ,结果证明这是NSSet中的NSSet。

将这两条路径对比后面的解释

someParentManObj.someRelatedChildManObj

someParentManObj.someRelatedChildManObj.someFieldOnChildManObj

显然,如果你只关注一个关系的NSManagedObject路径,而不是一个领域,那么你将会回来...... (1)关系的另一端是单个NSManagedObject,或者 (2)在关系的另一端有一个NSMan of NSManagedObjects。

但是,如果你调整路径使它以NSManagedObject上的字段名结尾,你就不会获得NSSet值,而是获得一个NSSet包装的NSSet。