我在Swift中的while循环不会终止,我缺少什么?

时间:2015-02-24 18:21:51

标签: ios swift while-loop

我有一个非常详细的while循环,并且一直拒绝再次寻求帮助,但我不知所措!我真的为这个循环代码道歉,有很多事情要发生,但我不想留下任何东西,以防你的观众需要看到这一切。

func retRhoCurrent() -> Double {
        while abs(pTarget - pCalc) > 1 {

            //
            // SET rhoCurrent
            //

            if (pTarget > pCalc) {
                rhoLow = rhoCurrent
                if(rhoCurrent >= rhoHigh) {
                    rhoCurrent += RHO_C
                    rhoHigh = rhoCurrent
                } else {
                    rhoCurrent += ((rhoHigh - rhoCurrent)/2)
                }
            } else {
                rhoHigh = rhoCurrent
                rhoCurrent += ((rhoLow - rhoCurrent)/2)
            }

            //
            // SET rhoR
            //

            rhoR = rhoCurrent / RHO_C

            //
            // SET DIFFERENTIAL
            //
            diffAggregate = 0
            for var kIndex = 0; kIndex < NK_VALUES.count; ++kIndex {
                diffSegment = NK_VALUES[kIndex]
                diffSegment *= pow(rhoR, IK_VALUES[kIndex])
                diffSegment *= pow(tempR, JK_VALUES[kIndex])
                iFactor = 0
                if LK_VALUES[kIndex] > 0 {
                    diffSegment *= exp(-1 * pow(rhoR, LK_VALUES[kIndex]))
                    iFactor = LK_VALUES[kIndex] * pow(rhoR, LK_VALUES[kIndex])
                }
                if PK_VALUES[kIndex] > 0 {
                    diffSegment *= exp(-1 * PK_VALUES[kIndex] * pow(rhoR, 2) - BK_VALUES[kIndex] * pow(tempR - UK_VALUES[kIndex], 2))
                    iFactor = 2 * rhoR * PK_VALUES[kIndex] * (rhoR - 1)
                }
                diffAggregate += (diffSegment * (IK_VALUES[kIndex] - iFactor))
            }

            //
            // SET pCalc
            //
            zDiff + 1 + diffAggregate
            pCalc = zDiff * R_CONST * 1000 * tempK * rhoCurrent
        }
        return rhoCurrent
    }

我想另一个问题我也是我想要的主要值,而while循环是rhoCurrent(因为我将使用这个##来计算别的东西)。做&#34;返回rhoCurrent&#34;会工作,对吗?

提前非常感谢!!

1 个答案:

答案 0 :(得分:2)

我认为您希望此行指定一个值,但它不会:

zDiff + 1 + diffAggregate

因为它没有分配值,所以diffAggregate循环的正文中不会使用while。由于此原因,也未使用rhoR。您的功能可以简化为:

func retRhoCurrent() -> Double {
        while abs(pTarget - pCalc) > 1 {

            //
            // SET rhoCurrent
            //

            if (pTarget > pCalc) {
                rhoLow = rhoCurrent
                if(rhoCurrent >= rhoHigh) {
                    rhoCurrent += RHO_C
                    rhoHigh = rhoCurrent
                } else {
                    rhoCurrent += ((rhoHigh - rhoCurrent)/2)
                }
            } else {
                rhoHigh = rhoCurrent
                rhoCurrent += ((rhoLow - rhoCurrent)/2)
            }

            //
            // SET pCalc
            //
            pCalc = zDiff * R_CONST * 1000 * tempK * rhoCurrent
        }
        return rhoCurrent
    }

我真的怀疑你在循环中使用但在函数内没有初始化的变量。 rhoLowrhoHighrhoCurrenttempKzDiffpTargetpCalc的初始值是多少?< / p>

这种方法非常混乱,取决于很多魔法。它正在修改它不拥有的值,这意味着您可能会在应用的其他区域遇到意外情况。它绝对不是线程安全的(虽然这对您来说可能不是一个问题)。