Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/116.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 在Swift中为摊销计划创建循环_Ios_Loops_Swift_Amortization - Fatal编程技术网

Ios 在Swift中为摊销计划创建循环

Ios 在Swift中为摊销计划创建循环,ios,loops,swift,amortization,Ios,Loops,Swift,Amortization,我想找出一个简单的循环,以便在Swift中计算摊销计划 到目前为止,以下是我在操场上的设置: let loanAmount: Double = 250000.00 let intRate: Double = 4.0 let years: Double = 30.0 var r: Double = intRate / 1200 var n: Double = years * 12 var rPower: Double = pow(1 + r, n) var monthlyPayment: Do

我想找出一个简单的循环,以便在Swift中计算摊销计划

到目前为止,以下是我在操场上的设置:

let loanAmount: Double = 250000.00
let intRate: Double = 4.0
let years: Double = 30.0

var r: Double = intRate / 1200
var n: Double = years * 12
var rPower: Double = pow(1 + r, n)

var monthlyPayment: Double = loanAmount * r * rPower / (rPower - 1)
var annualPayment: Double = monthlyPayment * 12
对于实际的循环,我不确定如何修复下面的代码

for i in 0...360 {

  var interestPayment: Double = loanAmount * r
  var principalPayment: Double = monthlyPayment - interestPayment
  var balance: Double; -= principalPayment
}

希望生成月度计划。提前感谢您提供的任何提示。

我猜您的意思是在循环外声明
余额
变量,并在循环内递减它:

// stylistically, in Swift it's usual to leave
// off the types like Double unless you have a
// reason to be explicit
let loanAmount = 250_000.00
let intRate = 4.0
let years = 30.0

// since these are one-off calculations, you
// should use let for them, too.  let doesn't
// just have to be for constant numbers, it just
// means the number can't change once calculated.
let r = intRate / 1200
let n = years * 12
let rPower = pow(1 + r, n)

// like above, these aren't changing.  always prefer let
// over var unless you really need to vary the value
let monthlyPayment = loanAmount * r * rPower / (rPower - 1)
let annualPayment = monthlyPayment * 12

// this is the only variable you intend to "vary"
// so does need to be a var
var balance = loanAmount

// start counting from 1 not 0 if you want to use an open
// (i.e. including 360) range, or you'll perform 361 calculations:
for i in 1...360 {
    // you probably want to calculate interest 
    // from balance rather than initial principal
    let interestPayment = balance * r
    let principalPayment = monthlyPayment - interestPayment

    balance -= principalPayment
    println(balance)
}
这应该打印出正确的余额,最终余额为零(实际上是9.73727765085641e-09,但这是一个整体)

如果要创建月度余额,例如在数组中,可以添加一个额外的数组变量来存储该余额:

var balance = loanAmount
//array of monthly balances, with the initial loan amount to start with:
var monthlyBalances = [balance]
for i in 1...360 {
    let interestPayment = balance * r
    let principalPayment = monthlyPayment - interestPayment

    balance -= principalPayment
    monthlyBalances.append(balance)
}
高级版本,适合感兴趣的任何人 您可能想知道是否有一种方法可以使用
let
而不是
var
来声明
monthlyBalances
。还有!您可以使用
reduce

let monthlyBalances = reduce(1...360, [loanAmount]) { 
  payments, _ in
    let balance = payments.last!
    let interestPayment = balance * r
    let principalPayment = monthlyPayment - interestPayment

    return payments + [balance - principalPayment]
}
然而,出于几个原因,这有点令人讨厌。如果Swift标准库有一个稍微不同的reduce版本,名为
accumulate
,它从一个运行总数中生成一个数组,那就更好了,如下所示:

let monthlyBalances = accumulate(1...360, loanAmount) { 
  balance, _ in
    let interestPayment = balance * r
    let principalPayment = monthlyPayment - interestPayment

    return balance - principalPayment
}
下面是
累积的定义:

func accumulate<S: SequenceType, U>
  (source: S, var initial: U, combine: (U, S.Generator.Element) -> U)
   -> [U] {
        var result: [U] = []
        result.append(initial)
        for x in source {
            initial = combine(initial, x)
            result.append(initial)
        }
        return result
}
func累加
(来源:S,var初始值:U,联合:(U,S.Generator.Element)->U)
->[U]{
变量结果:[U]=[]
result.append(初始)
对于源中的x{
初始=联合收割机(初始,x)
result.append(初始)
}
返回结果
}

删除分号
来自最后一行。这不会有帮助的…谢谢@Airspeed Velocity。你的回答真的很有帮助而且很广泛!你给了我很多思考的食物。。。