我们假设NSArray
NSArray
个NSNumber
个NSArray *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}}
...我的问题是:有没有比这更简单的方法?
我可以将矩阵更改为向量以减少一维,但我更喜欢比较输入矩阵的结构(而不是值)和一些具有相同数据类型的参考矩阵。
答案 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;
};
它实际上是一个平面的一维浮动系列,它更简单,更有效率。