美文网首页
Swift 值类型和引用类型

Swift 值类型和引用类型

作者: 独立开发者Lau | 来源:发表于2018-07-16 09:21 被阅读7次

    一、值语义
    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)都可检查相等性。
    ===同一运算符,可进行同一性检查。
    两个常量或两个变量可能相等(具有相同的值)但不同一(指向给定类型的不同实例);反过来不成立:如果两个变量或常量指向内存中的同一个实例,那它们一定也相等。

    相关文章

      网友评论

          本文标题:Swift 值类型和引用类型

          本文链接:https://www.haomeiwen.com/subject/dhadsftx.html