以下哪个更快,为什么?
CGFloat sum = 0;
for (UIView *v in self.subviews)
sum += v.frame.size.height;
或者
CGFloat sum = [[self.subviews valueForKeyPath:@"@sum.frame.size.height"] floatValue];
以下哪个更快,为什么?
CGFloat sum = 0;
for (UIView *v in self.subviews)
sum += v.frame.size.height;
或者
CGFloat sum = [[self.subviews valueForKeyPath:@"@sum.frame.size.height"] floatValue];
确实,一种语言的优雅(或聪明)很大程度上取决于它避免循环的能力。为,而;即使是快速枚举表达式也很麻烦。无论你如何粉饰它们,循环都将是一段代码,它执行的操作用自然语言描述起来要简单得多。
“给我这个数组中所有员工的平均工资”,
double totalSalary = 0.0;
for (Employee *employee in employees) {
totalSalary += [employee.salary doubleValue];
}
double averageSalary = totalSalary / [employees count];
相对...
幸运的是,Key-Value Coding 为我们提供了一种更简洁(几乎类似于 Ruby)的方式来执行此操作:
[employees valueForKeyPath:@"@avg.salary"];
KVC 集合运算符允许使用valueForKeyPath:中的键路径表示法对集合执行操作。
每当您在键路径中看到@时,它表示一个特定的聚合函数,其结果可以返回或链接,就像任何其他键路径一样。
快速枚举比 KVC 更快。
希望它可以帮助你。
首先,您的 KVC 表达式不起作用;KVC 不能用于检索结构成员(除了非常有限的情况,即类具有特殊实现的valueForKey:
特殊处理)。
其次,这听起来像是过早的优化。
您是否真的量化了与此代码相关的性能问题?
如果没有,您就是在浪费时间“优化”此代码路径。
除此之外,使用 KVC 进行此类操作会给您的代码增加相当大的脆弱性。编译器无法验证传递给的表达式valueForKey:
,因此,编译时错误或警告现在是运行时错误,只有在执行该代码路径时才会发现。