Ios 我在斯威夫特的while循环赢了';不要终止,我错过了什么?

Ios 我在斯威夫特的while循环赢了';不要终止,我错过了什么?,ios,swift,while-loop,Ios,Swift,While Loop,我有一个非常详细的while循环,我一直在抵制再次寻求帮助,但我不知所措!对于这个while循环代码,我真的很抱歉,有很多事情要做,但我不想遗漏任何东西,以防观众需要查看所有内容 func retRhoCurrent() -> Double { while abs(pTarget - pCalc) > 1 { // // SET rhoCurrent // if (pT

我有一个非常详细的while循环,我一直在抵制再次寻求帮助,但我不知所措!对于这个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
    }
func retRhoCurrent()->Double{
而abs(pTarget-pCalc)>1{
//
//设定电流
//
如果(pTarget>pCalc){
rhoLow=rhoCurrent
如果(rhoCurrent>=rhoHigh){
RHO电流+=RHO_C
rhoHigh=rhoCurrent
}否则{
rhoCurrent+=((rhoHigh-rhoCurrent)/2)
}
}否则{
rhoHigh=rhoCurrent
rhoCurrent+=((rhoLow-rhoCurrent)/2)
}
//
//设置rhoR
//
rhoR=RHO电流/RHO_C
//
//设置差分
//
diffAggregate=0
对于var kIndex=0;kIndex0{
diffSegment*=exp(-1*pow(rhoR,LK_值[kIndex]))
iFactor=LK_值[kIndex]*pow(rhoR,LK_值[kIndex])
}
如果PK_值[kIndex]>0{
diffSegment*=exp(-1*PK_值[kIndex]*pow(rhoR,2)-BK_值[kIndex]*pow(tempR-UK_值[kIndex],2))
iFactor=2*rhoR*PK_值[kIndex]*(rhoR-1)
}
diffAggregate+=(diffSegment*(IK_值[kIndex]-iFactor))
}
//
//设置pCalc
//
zDiff+1+diffAggregate
pCalc=zDiff*R_CONST*1000*tempK*rhoCurrent
}
回流
}
我想我还有一个问题,那就是我想从这个while循环中得到的主要值是rhoCurrent(因为我将使用这个final来计算其他的东西)。执行“返回电流”将起作用,对吗


非常感谢

我想您打算用这行来赋值,但它没有:

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
    }

我真的怀疑你在循环中使用的变量,但是没有在函数中初始化。
rhoLow
rhohai
rhoCurrent
tempK
zDiff
pTarget
pCalc
的初始值是什么


这种方法非常混乱,需要很多魔法。它正在修改它不拥有的值,这意味着您可能会在应用程序的其他区域遇到意想不到的事情。它绝对不是线程安全的(尽管这可能不是您关心的问题)。

一些快速评论:1)您在哪里设置pTarget值?2) 这似乎更多的是关于算法,而不是编程问题。也许输出值将有助于了解这是否如您预期的那样收敛,或者您有逻辑问题……您预期会发生什么,您观察到会发生什么?
pTarget
的典型值是什么?循环迭代时,
pCalc
是否接近该值?嗨,伊恩,哇!我不敢相信我错过了那个简单的错误…好眼力!对于我的变量rhoLow、rhoheigh、rhoCurrent等,我最初将它们设置为零。pTarget是唯一具有来自用户输入压力的初始值的目标。我将尝试修复这一行,看看它是否正确地输出我正在寻找的内容。再次感谢您花时间查看我混乱的代码部分,他正在修改范围内不属于此范围的变量。如果在两个不同的线程上同时调用该方法,则它们都可以独立地更改
rhoHigh
(例如)的值,并打乱另一个线程的其余循环。@Matty:当您最初将
zDiff
设置为
0
并且不给它一个新值时(可能是因为键入错误),您对
pCalc
的最终分配结果始终为
pCalc=0
。除非
pTarget
-1
1
之间,否则您的while循环将永远不会退出。@IanMacDonald更新:通过更改您捕获的行,我能够解决它!pCalc是在第一次迭代后计算的,因此它会发生变化(代码中的最后一行在第一次运行后将其设置为初始值)。你是不是碰巧错过了这个?您也可能是100%正确的,我可能刚从我的第一次尝试中获得了运气。
pCalc
如果
zDiff
始终设置为
0
,则不会更改,就像您更正键入错误之前的情况一样
pCalc=0*R_CONST*1000*tempK*rhoCurrent
pCalc=0
相同。