//: Playground - noun: a place where people can play

import UIKit

// 值类型:指的是当一个变量赋值给另外一个变量的时候, 是copy一个副本
// 两个变量之间互不影响, 也就是说, 另外一个变量的值改变, 不会影响到另外一个变量
// 也就是传的只是一个值, 不是一个引用(地址)
var a = 0
var b = a
b = 2
a // 闭包和函数都是引用类型
// 引用类型:指的是当引用类型变量赋值给另外一个变量的时候, 其实两个变量指的都是同一个内容
// 当其中一个变量修改了这个内容, 另外一个变量也会跟着改变
func calcTotalMiles(todayMiles: Int) -> () -> Int
{
var totalMiles = 0
return {
totalMiles += todayMiles; // 这个闭包用到了Capturing Values
return totalMiles
}
} var dailyTwoMiles = calcTotalMiles(2)
dailyTwoMiles()
dailyTwoMiles() var myPlan = dailyTwoMiles
myPlan()
myPlan() /*
同学A的理解:
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. 同学B的理解:
这里的关键是:calcTotalMiles返回了一个函数,这个函数以闭包的形式返回,我们没有给他起名,
这里姑且叫他resultFunction。要注意,这个resultFunction和calcTotalMiles不是一个东西,
resultFunction是calcTotalMiles的一个结果!
仔细看这个resultFunction函数体内,涉及的两个变量:totalMiles和todayMiles,
都没有在resultFunction里定义。那resultFunction是怎么拿到这个值的呢?
这个过程是swift使用一种称为Capturing Values的方式感知到的。与此同时,一点儿没有错,这将产生内存方面的问题。
在这里,你可以理解成,我们给calcTotalMiles传入一个参数,返回了一个函数resultFunction,
之后执行calcTotalMiles所使用的栈空间并没有被释放,因为产生的resultFunction还在使用(或者是拥有)调用者calcTotalMiles的内容。 我个人的理解是:
由于calcTotalMiles的返回值是resultFunction, 而resultFunction又引用着calcTotalMiles中的变量,
所以calcTotalMiles执行完之后并没有被销毁, 还保留在内存中...
所以当resultFunction再次调用的时候所拿到的totalMiles还没有被初始化..就会继续累加...
*/ // ps: 在实际中, 很少用到函数和闭包是引用类型这种情况, 这里仅仅作为了解...

  

Swift - 37 - 值类型和引用类型的简单理解的更多相关文章

  1. swift的值类型和引用类型

    前言 最近在学设计模式中,发现 Swift 中的 struct,class 以及 enum 在一般的使用中能够做到互相替换,因此探究其背后的逻辑就十分有必要.而这一问题又引出了 Swift 中的值类型 ...

  2. 6个重要的.NET概念: - 堆栈,堆,值类型,引用类型,装箱和拆箱(转)

    今天在Code Project上面看到一篇文章<6 important .NET concepts: - Stack, heap, Value types, reference types, b ...

  3. [No0000B5]C# 类型基础 值类型和引用类型 及其 对象判等 深入研究1

    引言 本文之初的目的是讲述设计模式中的 Prototype(原型)模式,但是如果想较清楚地弄明白这个模式,需要了解对象克隆(Object Clone),Clone其实也就是对象复制.复制又分为了浅度复 ...

  4. Swift 值类型和引用类型

    Swift中的类型分为两类:一,值类型(value types),每个值类型的实例都拥有各自唯一的数据,通常它们是结构体,枚举或元组:二,引用类型(reference types),引用类型的实例共享 ...

  5. Swift 值类型/引用类型

    1.值类型/引用类型 在 Swift 语言中,所有的类型都可以被分为 "值类型" 或者 "引用类型",可以将其理解为函数参数传递的方式. 值类型表示的是将它传递 ...

  6. Swift - 值类型与引用类型的初步探究

    前言 swift中的结构体和类在组成和功能上具有一定的相似性.两者都可以含有成员属性.成员方法用于数据存储和功能性模块封装.往往造成不知如何对二者进行区分和使用 值类型概念和引用类型概念 值类型的概念 ...

  7. C# - 值类型、引用类型&走出误区,容易错误的说法

    1. 值类型与引用类型小总结 1)对于引用类型的表达式(如一个变量),它的值是一个引用,而非对象. 2)引用就像URL,是允许你访问真实信息的一小片数据. 3)对于值类型的表达式,它的值是实际的数据. ...

  8. 【译】.NET中六个重要的概念:栈、堆、值类型、引用类型、装箱和拆箱

    为何要翻译 一来是为了感受国外优秀技术社区知名博主的高质量文章,二来是为了复习对.NET技术的基础拾遗达到温故知新的效果,最后也是为了锻炼一下自己的英文读写能力.因为是首次翻译英文文章(哎,原谅我这个 ...

  9. 图解C#的值类型,引用类型,栈,堆,ref,out

    C# 的类型系统可分为两种类型,一是值类型,一是引用类型,这个每个C#程序员都了解.还有托管堆,栈,ref,out等等概念也是每个C#程序员都会接触到的概念,也是C#程序员面试经常考到的知识,随便搜搜 ...

随机推荐

  1. C#.Net参数

    C#.Net参数 阅读目录 引言 形参和实参 命名实参 可选参数 params,数目可变参数 方法解析与重载决策 参数传递      [重难点] ref引用参数/out输出参数   参数修饰符 泛型类 ...

  2. C#程序设计基础——数据类型

    C#是强类型语言,因此每个变量和对象都必须具有声明类型.数据类型可描述为内置数据类型(如int或char),用户定义数据类型(如class或interface).数据类型还可以定义为值类型(用于存储值 ...

  3. nterrupt 和 using 在C51中断中的使用

    8051系列MCU的基本结构包括:32个I/O口(4 组8bit 端口):两个16位定时计数器:全双工串行通信:6个中断源(2个外部中断.2个定时/计数器中断.1个串口输入/输出中断),两级中断优先级 ...

  4. -_-#【Angular】定义服务

    AngularJS学习笔记 <!DOCTYPE html> <html ng-app="Demo"> <head> <meta chars ...

  5. zznu 1255 数字统计(数位DP, 数学方法)

    最近在学数位DP, 感觉还是满有收获的! 做了几个题之后想起来自己OJ上曾经做的一道题,以前是用数学方法写的,现在改用数位DP来写了一遍. 题目: 1255: 数字统计 时间限制: 1 Sec  内存 ...

  6. 【转】Linux I2C设备驱动编写(二)

    原文网址:http://www.cnblogs.com/biglucky/p/4059582.html 在(一)中简述了Linux I2C子系统的三个主要成员i2c_adapter.i2c_drive ...

  7. LVS安装配置

    LVS安装部署 一.LVS安装(CENTOS) 1.LVS模块ip_vs已经内置在LINUX内核中,一般情况下ip_vs并没有启动,可以通过lsmod | grep ip_vs查看,能够看到信息表示模 ...

  8. HBASE API操作问题总结

    org.apache.hadoop.hbase.MasterNotRunningException 在centos中查看,发现没有HMaster进程 解决方法: 1.启动hadoop后,需要等一段时间 ...

  9. The ToolStripMenuItem visible value always false

    http://social.msdn.microsoft.com/Forums/vstudio/en-US/8cf60e57-6d97-43c6-bb3a-394b9bf130af/the-tools ...

  10. [Java] List / ArrayList - 源代码学习笔记

    在阅读 List / ArrayList 源代码过程中,做了下面的笔记. LinkedList 的笔记较多,放到了另一篇博文 LinkedList / Queue- 源代码学习笔记 List List ...