重新建个,再试试
这个函数压根就没声明有返回值
注意,var totalMiles = 0 这句是处在 calcTotalMiles 函数中。
而你说的每次调用,调用的并不是 calcTotalMiles 这个函数,而是 calcTotalMiles 这个函数的返回值,也就是另一个函数。返回的函数被命名为 dailyTwoMiles 或者 dailyThreeMiles,返回函数的内容是闭包内容:{totalMiles += todayMiles; return totalMiles; },其中并没有对 totalMiles 重置的语句,所以totalMiles不会被重置。
那么问题来了,totalMiles 什么时候被重置。很简单,var totalMiles = 0 处在 calcTotalMiles 函数中,当然是 calcTotalMiles 被调用时会被重置,也就是 var dailyTwoMiles = calcTotalMiles(2) 和 var dailyThreeMiles = calcTotalMiles(3) 这两句在运行时会重置 titalMiles.
因为闭包中包含该句: return {totalMiles+=todayMiles;return totalMiles}; 再次调用只是执行此闭包,不再执行外在参数赋值部分。
这个是老师在其他问题中的回答:
这是一个很深入的话题。我正在策划后续做swift的高级课程时或许会涉及。
这里的关键是:calcTotalMiles返回了一个函数,这个函数以闭包的形式返回,我们没有给他起名,这里姑且叫他resultFunction。要注意,这个resultFunction和calcTotalMiles不是一个东西,resultFunction是calcTotalMiles的一个结果!
仔细看这个resultFunction函数体内,涉及的两个变量:totalMiles和todayMiles,都没有在resultFunction里定义。那resultFunction是怎么拿到这个值的呢?这个过程是swift使用一种称为Capturing Values的方式感知到的。与此同时,一点儿没有错,这将产生内存方面的问题。在这里,你可以理解成,我们给calcTotalMiles传入一个参数,返回了一个函数resultFunction,之后执行calcTotalMiles所使用的栈空间并没有被释放,因为产生的resultFunction还在使用(或者是拥有)调用者calcTotalMiles的内容。
那么现在问题来了:什么时候calcTotalMiles的空间会被真正释放?在这个例子里,swift的ARC(Auto Reference Counting)机制会帮我们自动处理。我们不需要处理内存的问题。但是,这样的一种机制确实会产生循环引用的问题。这就是我说的,我策划在后续介绍的swift高级课程里要涉及的内存管理相关内容:。
我个人的理解是:
由于calcTotalMiles的返回值是resultFunction, 而resultFunction又引用着calcTotalMiles中的变量, 所以calcTotalMiles执行完之后并没有被销毁, 还保留在内存中...所以当resultFunction再次调用的时候所拿到的totalMiles还没有被初始化..就会继续累加...
这是一个很深入的话题。我正在策划后续做swift的高级课程时或许会涉及。
这里的关键是:calcTotalMiles返回了一个函数,这个函数以闭包的形式返回,我们没有给他起名,这里姑且叫他resultFunction。要注意,这个resultFunction和calcTotalMiles不是一个东西,resultFunction是calcTotalMiles的一个结果!
仔细看这个resultFunction函数体内,涉及的两个变量:totalMiles和todayMiles,都没有在resultFunction里定义。那resultFunction是怎么拿到这个值的呢?这个过程是swift使用一种称为Capturing Values的方式感知到的。与此同时,一点儿没有错,这将产生内存方面的问题。在这里,你可以理解成,我们给calcTotalMiles传入一个参数,返回了一个函数resultFunction,之后执行calcTotalMiles所使用的栈空间并没有被释放,因为产生的resultFunction还在使用(或者是拥有)调用者calcTotalMiles的内容。
那么现在问题来了:什么时候calcTotalMiles的空间会被真正释放?在这个例子里,swift的ARC(Auto Reference Counting)机制会帮我们自动处理。我们不需要处理内存的问题。但是,这样的一种机制确实会产生循环引用的问题。这就是我说的,我策划在后续介绍的swift高级课程里要涉及的内存管理相关内容:。