为什么 [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。
我正在关注 [NSManagedObject valueForKeyPath:...]
,然后检查 查询 返回的结果,看它是单个 NSManagedObject 还是托管对象的 NSSet。如果它是 NSSet,我正在尝试使用 [NSSet allObjects]
它没有按预期返回 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。