Objective-C 你能用快速枚举代替 "for (i = 0; i < X; i++)"
Objective-C can you use fast enumeration in place of "for (i = 0; i < X; i++)"
假设我有一个像这样的基本整数迭代:
NSInteger rowCount = self.rowCount;
for (int i = 0; i < rowCount; i++) {
// stuff!
}
有没有办法使用快速枚举块来实现?我当然可以创建一个整数数组 0 - self.RowCount,但这似乎并不比这样做更高效。
没有。快速枚举是一种维护迭代状态的技术,这样可以更有效地迭代集合。它克服了很多集合不在 O(1) 中建立索引的事实,因此通过索引对它们进行迭代将比 O(N) 更大。由于方法调用的成本(例如 objectAtIndex:
),即使是在 O(1) 中进行索引的集合也可能会花费大量的常数时间。如果您查看 NSFastEnumeration
协议,您会注意到它依赖于创建高效索引的 C 数组。
一个 for
递增整数(可能被优化到寄存器中)的循环没有同样的问题,快速枚举不会提供解决方案。
当然,如果 // stuff!
确实包含对 self
的索引,那么快速枚举会好得多(你根本不应该使用索引),但问题暗示这不是事实并非如此。
假设我有一个像这样的基本整数迭代:
NSInteger rowCount = self.rowCount;
for (int i = 0; i < rowCount; i++) {
// stuff!
}
有没有办法使用快速枚举块来实现?我当然可以创建一个整数数组 0 - self.RowCount,但这似乎并不比这样做更高效。
没有。快速枚举是一种维护迭代状态的技术,这样可以更有效地迭代集合。它克服了很多集合不在 O(1) 中建立索引的事实,因此通过索引对它们进行迭代将比 O(N) 更大。由于方法调用的成本(例如 objectAtIndex:
),即使是在 O(1) 中进行索引的集合也可能会花费大量的常数时间。如果您查看 NSFastEnumeration
协议,您会注意到它依赖于创建高效索引的 C 数组。
一个 for
递增整数(可能被优化到寄存器中)的循环没有同样的问题,快速枚举不会提供解决方案。
当然,如果 // stuff!
确实包含对 self
的索引,那么快速枚举会好得多(你根本不应该使用索引),但问题暗示这不是事实并非如此。