如何验证多维NSArray结构?

时间:2015-02-21 20:46:56

标签: ios objective-c validation multidimensional-array nsarray

我们假设NSArray NSArrayNSNumberNSArray *transform = @[ @[@1, @0, @1], @[@0.01f, @1, @0], @[@1, @0, @1.1f] ]; 这样:

NSArray

我们希望根据NSNumber" 的规则" 3x3 BOOL __block validTransform = YES; if (transform && [transform count] == 3) { [transform enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { NSLog(@"object: %lu of aClass: %@", idx, [obj class]); if ([obj isKindOfClass:[NSArray class]] && [obj count] == 3) { [obj enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { NSLog(@"- object: %lu of aClass: %@", idx, [obj class]); if (![obj isKindOfClass:[NSNumber class]]) { validTransform = NO; *stop = YES; } }]; } else { validTransform = NO; *stop = YES; } }]; } else validTransform = NO; NSAssert(validTransform == YES, @"Transform must be 3x3 NSArray of NSNumber"); if (!validTransform) return ...; 验证其结构。 我开发的解决方案是这样的:

{{1}}

...我的问题是:有没有比这更简单的方法?

我可以将矩阵更改为向量以减少一维,但我更喜欢比较输入矩阵的结构(而不​​是值)和一些具有相同数据类型的参考矩阵。

2 个答案:

答案 0 :(得分:1)

你有什么工作所以你不应该真的担心它。问题很小,你应该没有性能问题。如果内部循环失败,你可以通过打破外部循环来提高效率,尽管只有测试会显示这是否真的有用。

如果您担心代码的复杂性,请添加一个小评论。

您可以将代码拆分为每个级别的方法,但实际上您所拥有的可能是您的问题的解决方案,因为它不是标准验证,而是自定义结构。

主要的替代方案是数组结构与数组数组(如浮点结构)不同。

答案 1 :(得分:1)

我认为这是一个转换矩阵?

NSArrays和NSNumbers是一个糟糕的选择。使用固定大小的C数组或结构要好得多。 (矩阵)

NSNumbers是不可变的,因此每当值发生变化时,您都必须创建一个新的。

遍历外部数组以到达内部数组,然后从内部数组中获取对象需要方法调用,这很慢。将NSNumber转换为数字标量也是方法调用。

通常,转换矩阵应用于数千甚至数百万个点,因此使用NSArrays的开销增加了。看看CATransform3D的定义(这是一个4x4矩阵,但它仍然给你一个想法...)

struct CATransform3D
{
  CGFloat m11, m12, m13, m14;
  CGFloat m21, m22, m23, m24;
  CGFloat m31, m32, m33, m34;
  CGFloat m41, m42, m43, m44;
};

它实际上是一个平面的一维浮动系列,它更简单,更有效率。