尝试在Swift中打印函数时出现EXC_BAD_指令错误

尝试在Swift中打印函数时出现EXC_BAD_指令错误,swift,swift-playground,Swift,Swift Playground,我目前正在从事一个大学数学项目,该项目要求我创建一个与抵押贷款相关的应用程序。我正在尝试编写Swift代码,用于计算每月抵押贷款的本金和利息 我写的代码如下所示(值得一提的是,我对编写代码非常陌生,有一点Python的经验,这都是自学的,所以欢迎任何批评!) //声明所有变量 //y=定期利率 //n=还款期剩余时间(月) 设y=[Float](阵列并行:0.02/12,0.03/12,0.04/12,0.05/12) 设n=[Float](阵列并行:240180120,60) 变量x=[Flo

我目前正在从事一个大学数学项目,该项目要求我创建一个与抵押贷款相关的应用程序。我正在尝试编写Swift代码,用于计算每月抵押贷款的本金和利息

我写的代码如下所示(值得一提的是,我对编写代码非常陌生,有一点Python的经验,这都是自学的,所以欢迎任何批评!)

//声明所有变量
//y=定期利率
//n=还款期剩余时间(月)
设y=[Float](阵列并行:0.02/12,0.03/12,0.04/12,0.05/12)
设n=[Float](阵列并行:240180120,60)
变量x=[Float]()
var利息=[浮动]()
变量T_1=[Int]()
//创建从0到240的数组
对于0…240中的a{
T_1.附加(a)
}
//创建所有240个兴趣值的数组
对于0…239中的a{
如果a<60{
利息追加(y[0])
var=n[0]
x、 追加(偿还)
}
否则,如果a<120{
利息。追加(y[1])
var=n[1]
x、 追加(偿还)
}
否则,如果a<180{
利息追加(y[2])
var=n[2]
x、 追加(偿还)
}
否则{
利息。追加(y[3])
风险值=n[3]
x、 追加(偿还)
}
}
打印(“兴趣数组:”,兴趣)
//计算每个月支付的本金和利息
func variablerate(P:inout Float)->[Float]{
变量主体=[Float]()
已支付的风险值=[浮动]()
风险值还款=[浮动]()
var R=浮动(0)
设时间P=P
i_付费。追加(0)
对于0…240中的a{

如果(a>0)和(a碰撞原因索引超出范围

您得到的索引超出范围异常是因为在代码中,您正在运行从0到240的循环,并且从局部变量a减去1,因此在第一次迭代中a将包含0,从0减去1将给出负索引

这是一个错误

对于0…240中的a{
如果(a>0)和(a[Float]{ 变量主体=[Float]() 已支付的风险值=[浮动]() 风险值还款=[浮动]() var R=浮动(0) 设时间P=P i_付费。追加(0) 对于in 1…240{//立即更正的代码循环,从1转到240
如果(a>0)和(aI)在这之前出现错误,例如未解析的标识符“pow”?@dylan在我的Swift游乐场上不会出现其他错误。pow(double,double)已用于使用powers的表达式。在编译项目中运行代码时,在
i_paid.append(i_paid[a-1]+ip)处出现“致命错误:索引超出范围”将中止
a
为零时……请注意,
返回主体
从不执行。
// Declare all variables
// y = periodic interest rate
// n = time left of repayment period (months)

let y = [Float](arrayLiteral: 0.02/12,0.03/12,0.04/12,0.05/12)
let n = [Float](arrayLiteral: 240,180,120,60)

var x = [Float]()
var interest = [Float]()
var T_1 = [Int]()

// Create Array from 0 to 240
for a in 0...240 {
    T_1.append(a)
}

// Create Array of all 240 interest values

for a in 0...239 {
    if a < 60 {
        interest.append(y[0])
        var repay = n[0]
        x.append(repay)
    }
    else if a < 120 {
        interest.append(y[1])
        var repay = n[1]
        x.append(repay)
    }
    else if a < 180 {
        interest.append(y[2])
        var repay = n[2]
        x.append(repay)
    }
    else {
        interest.append(y[3])
        var repay = n[3]
        x.append(repay)
    }
}
print("Interest array:",interest)

// Calculate Each months Principal paid and Interest Paid

func variablerate(P: inout Float) -> [Float] {
    var principal = [Float]()
    var i_paid = [Float]()
    var repayments = [Float]()
    var R = Float(0)
    let temporaryP = P
    i_paid.append(0)

    for a in 0...240 {
        if (a>0) && (a<240) && (interest[a-1] == interest[a]) {
            let ip = P*(1+interest[a-1])-P
            i_paid.append(i_paid[a-1] + ip)
            P = (1+interest[a-1])*temporaryP
            P = P-R
            let h = interest[a]
            R = (P*h)/(1-pow(1+h,Float(interest.count-a)))
            repayments.append(R)
            principal.append(round(100*P)/100)
        }
        else if a==240 || a==241 {
            P = P - R
            principal.append(round(100*P)/100)
            let ip = P*(1+interest[a-1])-P
            i_paid.append(i_paid[a-1] + ip)
            let h = interest[a-1]
            P = P*(1+h)
        }
        else {
            P = P - R
            let h = interest[a]
            R = (P*h)/(1-pow(1+h,Float(interest.count-a)))
            repayments.append(R)
            principal.append(round(100*P)/100)
            let ip = P*(1+interest[a])-P
            i_paid.append(i_paid[a-1] + ip)
            P = P*(1+h)
        }
    }
    return i_paid
    return principal

}
var z = Float(100000)

print(variablerate(P: &z)) //This is where the error appears
// Declare all variables
// y = periodic interest rate
// n = time left of repayment period (months)

let y = [Float](arrayLiteral: 0.02/12,0.03/12,0.04/12,0.05/12)
let n = [Float](arrayLiteral: 240,180,120,60)

var x = [Float]()
var interest = [Float]()
var T_1 = [Int]()

// Create Array from 0 to 240
for a in 0...240 {
    T_1.append(a)
}

// Create Array of all 240 interest values

for a in 0...239 {
    if a < 60 {
        interest.append(y[0])
        var repay = n[0]
        x.append(repay)
    }
    else if a < 120 {
        interest.append(y[1])
        var repay = n[1]
        x.append(repay)
    }
    else if a < 180 {
        interest.append(y[2])
        var repay = n[2]
        x.append(repay)
    }
    else {
        interest.append(y[3])
        var repay = n[3]
        x.append(repay)
    }
}
print("Interest array:",interest)

// Calculate Each months Principal paid and Interest Paid

func variablerate(P: inout Float) -> [Float] {
    var principal = [Float]()
    var i_paid = [Float]()
    var repayments = [Float]()
    var R = Float(0)
    let temporaryP = P
    i_paid.append(0)

    for a in 1...240 { // Code corrected now loop go from 1 to 240 
        if (a>0) && (a<240) && (interest[a-1] == interest[a]) {
            let ip = P*(1+interest[a-1])-P
            i_paid.append(i_paid[a-1] + ip)
            P = (1+interest[a-1])*temporaryP
            P = P-R
            let h = interest[a]
            R = (P*h)/(1-pow(1+h,Float(interest.count-a)))
            repayments.append(R)
            principal.append(round(100*P)/100)
        }
        else if a == 240 || a == 241 {
            P = P - R
            principal.append(round(100*P)/100)
            let ip = P*(1+interest[a-1])-P
            i_paid.append(i_paid[a-1] + ip)
            let h = interest[a-1]
            P = P*(1+h)
        }
        else {
            P = P - R
            let h = interest[a]
            R = (P*h)/(1-pow(1+h,Float(interest.count-a)))
            repayments.append(R)
            principal.append(round(100*P)/100)
            let ip = P*(1+interest[a])-P
            i_paid.append(i_paid[a-1] + ip)
            P = P*(1+h)
        }
    }
    //return i_paid
    return principal

}
var z = Float(100000)

print("\(variablerate(P: &z))")