//: 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. html5 中常用的标签和属性

    标签: <blockquote> 标签定义摘自另一个源的块引用. <blockquote> 与 </blockquote> 之间的所有文本都会从常规文本中分离出来, ...

  2. angular2 学习笔记 ( Component 组件)

    refer : https://angular.cn/docs/ts/latest/guide/template-syntax.html https://angular.cn/docs/ts/late ...

  3. cloudstack的ZONE删除不掉?来这招吧

    老是提示什么物理网络被使用之类的, 可以进数据库去直接删除. I want to delete a zone,by this way:(1)delete all VMs in zone.(2)dele ...

  4. 【Java线程】Java线程池ExecutorService

    示例 import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.u ...

  5. /etc/fstab自动挂载文件系统

    打开 /etc/fstab 文件 [root@www ~]# vi /etc/fstab 默认情况下,fstab中已经有了当前的分区配置,内容可能类似: # <file system> & ...

  6. 浅谈SQL Server中的快照

    原文地址:http://www.cnblogs.com/CareySon/archive/2012/03/30/2424880.html 简介 数据库快照,正如其名称所示那样,是数据库在某一时间点的视 ...

  7. PCRE

    http://blog.sina.com.cn/s/blog_6a1837e901010ckv.html http://hubeihuyanwei.blog.163.com/blog/static/2 ...

  8. [Design Pattern] Proxy Pattern 简单案例

    Proxy Pattern, 即代理模式,用一个类代表另一个类的功能,用于隐藏.解耦真正提供功能的类,属于结构类的设计模式. 下面是 代理模式的一个简单案例. Image 定义接口,RealImage ...

  9. objc_msgSend iOS8 EXC_BAD_ACCESS

    如果方法是没有返回值的,需要强转一个返回类型为void的临时函数指针, void (*objc_msgSendTyped)(id self, SEL _cmd, id obj, id arg1) = ...

  10. C - Courses - hdu 1083(模板)

    一共有N个学生跟P门课程,一个学生可以任意选一 门或多门课,问是否达成: 1.每个学生选的都是不同的课(即不能有两个学生选同一门课) 2.每门课都有一个代表(即P门课都被成功选过) 输入为: P N( ...