为什么 [NSSet allObjects] 不返回集合中的对象数组

Why is [NSSet allObjects] not returning an array of objects in the set

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

将其传输到 NSArray

它没有按预期返回 NSSet 成员的 NSArray。

guids = [result allObjects]

result 实际上是一个 NSSet,但它返回一个包含 NSSet 的数组。

当我询问数组中有多少个对象时,我的答案是“1”...

[guids count] // returns 1

    NSArray *guids;

    id result = [someNSManagedObject valueForKeyPath:kvcPath];

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

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

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

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

看下图(搞笑),枚举器本应查看集合中的单个值,但它却将整个集合视为值。

感谢上面评论中的 rmaddy,事实证明这是 NSSet 中的 NSSet。

对比这两条路径,下面的解释

someParentManObj.someRelatedChildManObj

对比

someParentManObj.someRelatedChildManObj.someFieldOnChildManObj

显然,如果您遵循 NSManagedObject 路径只是为了一种关系,而不是更进一步,例如一个字段,那么您将返回... (1) 关系另一端的单个 NSManagedObject,或 (2) 关系另一端的 NSManagedObjects 的 NSSet。

但是,如果您调整路径使其以 NSManagedObject 上的字段名称结尾,您将不会获得 NSSet 值,而是获得包含在 NSSet 中的 NSSet。