是否在Swift中评估每个循环的for循环条件?

是否在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() {

我在工作中有一个小争论:在运行数组的项目之前,用swift计算数组的大小是否是一个好的做法?更好的代码实践是什么:

选项A:

    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”调用。不是关于调用具有特殊副作用的方法。