一、值语义
Swift的基本类型(Array,Dictionary, Int, String等)都是用结构体实现的,都是值类型。一般应该尽量优先用struct实现数据建模,只有在需要的时候才用class。
如:
import Cocoa
var str = "Hello, playground"
var playgroundGreeting = str
playgroundGreeting += "!How are you today?"
str
改变playgroundGreeting的值,str的值不会发生改变。
二、引用语义
对于值语义,把实例赋给新常量或变量会产生一个副本,把值类型的实例作为参数传递给函数也一样;而引用类型实例的行为则不同,会对底层实例创建新的引用。
三、值类型常量和引用类型常量
声明为常量的值类型不能改变属性,即使属性在类型实现中是用var声明的也是一样。可把值类型的实例想象成标示一个整体的值,就像整数。
不能改变声明为常量的值类型实例的属性,但是可以改变声明为常量的引用类型实例的属性。
四、配合使用值类型和引用类型
可以在值类型内部使用引用类型,也可以在引用类型内部使用值类型。但是大部分情况下不要在值类型内部使用引用类型。若确实需要在结构体内部使用引用类型,最好使用不可变实例。
五、复制
Swift没有在语言层面提供深复制的支持,这意味着Swift中的复制就是浅复制。浅复制不会创建实例的不同副本,而是复制这个实例的引用。深复制会复制引用指向的目标,但是Swift没有提供执行深复制的方法,若需要,须自己编写。
六、相等与同一
理解了值类型和引用类型的区别,可以再看看相等和同一。相等是指两个实例就可见的特征来说具有一样的值,比如具有同样文本的两个String实例。同一则是指两个变量或常量是否指向内存中的同一个实例。
let x = 1
let y = 1
x == y
==相等运算符,Swift中所有的基本数据类型(String、Int、Float、Double、Array和Dictionary)都可检查相等性。
===同一运算符,可进行同一性检查。
两个常量或两个变量可能相等(具有相同的值)但不同一(指向给定类型的不同实例);反过来不成立:如果两个变量或常量指向内存中的同一个实例,那它们一定也相等。
网友评论