值类型被赋予给一个变量,常数或者本身被传递给一个函数的时候,实际上操作的是其的拷贝。
在 Swift 中,所有的基本类型:
整数(Integer)、浮点数(floating-point)、布尔值(Booleans)、字符串(string)、数组(array)和字典(dictionaries),都是值类型,
并且都是以结构体的形式在后台所实现。
在 Swift 中,所有的结构体和枚举都是值类型。这意味着它们的实例,以及实例中所包含的任何值类型属性,在代码中传递的时候都会被复制。
Swift 中数组(Array)和字典(Dictionary)类型均以结构体的形式实现。
然而当数组被赋予一个常量或变量,或被传递给一个函数或方法时,其拷贝行为与字典和其它结构体有些许不同。
以下是对于数组,字典,字符串和其它值的拷贝的描述:
在你的代码中,拷贝好像是确实是在有拷贝行为的地方产生过。 然而,在 Swift 的后台中,只有确有必要,实际(actual)拷贝才会被执行。 Swift 管理所有的值拷贝以确保性能最优化的性能, 所以你也没有必要去避免赋值以保证最优性能。(实际赋值由系统管理优化)
实际上我也不明白..就暂且当数组和字典在拷贝的时候是引用类型的
引用类型在被赋予到一个变量、常量或者被传递到一个函数时,操作的是引用,其并不是拷贝。因此,引用的是已存在的实例本身而不是其拷贝。
let tenEighty = VideoMode() tenEighty.resolution = hd tenEighty.interlaced = true tenEighty.name = "1080i" tenEighty.frameRate = 25.0 let alsoTenEighty = tenEighty alsoTenEighty.frameRate = 30.0 if tenEighty === alsoTenTighty { println("tenTighty and alsoTenEighty refer to the same Resolution instance.") }
然而,结构体实例总是通过值传递,类实例总是通过引用传递。这意味两者适用不同的任务。当你在考虑一个工程项目的数据构造和功能的时候,你需要决定每个数据构造是定义成类还是结构体。
按照通用的准则,当符合一条或多条以下条件时,请考虑构建结构体:
合适的结构体候选者包括:
width
属性和height
属性,两者均为Double
类型。start
属性和length
属性,两者均为Int
类型。x
,y
和z
属性,三者均为Double
类型。在所有其它案例中,定义一个类,生成一个它的实例,并通过引用来管理和传递。实际中,这意味着绝大部分的自定义数据构造都应该是类,而非结构体。
原文地址:http://www.cnblogs.com/zhepama/p/3857306.html