是否在Swift中评估每个循环的for循环条件?
我在工作中有一个小争论:在运行数组的项目之前,用swift计算数组的大小是否是一个好的做法?更好的代码实践是什么: 选项A:是否在Swift中评估每个循环的for循环条件?,swift,for-loop,Swift,For Loop,我在工作中有一个小争论:在运行数组的项目之前,用swift计算数组的大小是否是一个好的做法?更好的代码实践是什么: 选项A: func setAllToFalse() { for (var i = 0; i < mKeyboardTypesArray.count; i++ ) { self.mKeyboardTypesArray[i] = false } } func setAllToFalse() {
func setAllToFalse() {
for (var i = 0; i < mKeyboardTypesArray.count; i++ ) {
self.mKeyboardTypesArray[i] = false
}
}
func setAllToFalse() {
let typesCount = mKeyboardTypesArray.count
for (var i = 0; i < typesCount; i++ ) {
self.mKeyboardTypesArray[i] = false
}
}
func setAllToFalse(){
对于(变量i=0;i
或选项B:
func setAllToFalse() {
for (var i = 0; i < mKeyboardTypesArray.count; i++ ) {
self.mKeyboardTypesArray[i] = false
}
}
func setAllToFalse() {
let typesCount = mKeyboardTypesArray.count
for (var i = 0; i < typesCount; i++ ) {
self.mKeyboardTypesArray[i] = false
}
}
func setAllToFalse(){
让typescont=mKeyboardTypesArray.count
对于(变量i=0;i
当然,如果我在循环过程中不改变数组的话
我确实查阅了文件,其中说明:
循环执行如下:
首次输入循环时,初始化表达式为
计算一次,以设置所需的任何常量或变量
循环。将计算条件表达式。如果它评估
如果为false,则循环结束,在for之后继续执行代码
循环的右大括号(})。如果表达式的计算结果为true,则返回代码
通过执行大括号内的语句继续执行。
执行所有语句后,增量表达式为
评价的。它可能会增加或减少计数器的值,或者
将其中一个初始化变量设置为基于
发言的结果。在完成增量表达式之后
计算后,执行返回到步骤2,条件表达式
再次进行评估
用Swift表达这一点的惯用方式是:
func setAllToFalse() {
mKeyboardTypesArray = mKeyboardTypesArray.map {_ in false}
}
这样,就没有什么可评估的,也没有什么可计算的了
事实上,这将是一个很好的数组方法:
extension Array {
mutating func setAllTo(newValue:T) {
self = self.map {_ in newValue}
}
}
现在你可以说:
mKeyboardTypesArray.setAllTo(false)
或者,您也可以这样做(这涉及计数,但仅一次):
每次通过循环都会评估循环条件。考虑这个实验:
extension Array {
var myCount: Int {
get {
println("here")
return self.count
}
}
}
let a = [1, 2, 3, 4, 5]
for var i = 0; i < a.myCount; i++ {
println(a[i])
}
扩展数组{
var myCount:Int{
得到{
println(“此处”)
返回自计数
}
}
}
设a=[1,2,3,4,5]
对于var i=0;i
输出:
这里1
这里
2
这里
3
这里
4
这里
5
这里
您可以从选项B中看到一点速度提升,但是如果阵列保持不变,我希望
阵列上的计数
属性并不昂贵。无论如何,这可能是一个很好的代码实践,因为它向读者传达了您希望数组大小在循环期间保持不变的信息
编译器可能会通过检测到循环中没有任何内容修改数组来优化array.count
,但它无法对array.myCount
进行优化,因为println
有副作用。我发现它不是,如果在数组中进行迭代并删除项(例如),可能会导致崩溃。在当前Swift语法中,这是for循环
for i in 0..<m_pendingCommands.count
{
if m_pendingCommands[i].packetID < command.packetID
{
m_pendingCommands.remove(at: i)
}
}
对于0中的i..我认为您要么研究生成的汇编代码,要么等到Swift开源。Swift编译器应该非常智能,有很多优化。另外,如果您确定数组没有更改,可以在数组{…}
中为val使用:,这肯定是最快的方法。@Kametrixom,您是对的。然而,你不能使用。。在上例中的语法中,您得到的val实际上是一个let变量,并且无法更改,因此您必须使用较长的语法。您可以对数组{…}
;)中的var val使用)。但是我知道你的意思,你可以在0中为i使用。但是我完全忘记了0。是的,我真的很喜欢Swift有很多不同的for循环语法(es?)并不能真正回答这个问题,但我通常更倾向于使用函数式编程,它可以使de看起来更漂亮,并消除许多潜在的错误。我不想开始争论,但我认为他指的是选项a或选项B,这些选项是C样式的循环。那不是好的敏捷风格。这就是我的答案。如果你有不同的答案,请给出你的答案。让群众来决定。请不要老是唠叨我的评论。谢谢。我认为整个问题都围绕优化器是否可以优化掉“array.count”调用。不是关于调用具有特殊副作用的方法。