引用类型和值类型

温馨提示:本文最后更新于2024-07-31 16:11:17,某些文章具有时效性,若有错误或已失效,请在下方留言

两者区别

布尔、数字、字符串、数组、字典、结构体等都是 Swift 中的值类型。类是引用类型,闭包也是引用类型。

引用类型在分配时是共享的,指向同一条数据,可以有多个所有者;值在分配时是复制的,只有一个所有者。

闭包是引用类型

func createIncrementer() -> () -> Void {
    var counter = 0
    
    return {
        counter += 1
        print(counter)
    }
}


let incrementer = createIncrementer()
incrementer() // 1
incrementer() // 2

let incrementerCopy = incrementer
incrementerCopy() // 3
incrementerCopy() // 4

因为incrementerincrementerCopy都指向完全相同的闭包,因此也指向相同的捕获值。

为什么使用结构体

值类型是被复制而不是共享,如果代码中有三个不同的东西指向同一个结构体,它们将各自拥有自己的副本,不会出现互相干扰的情况。

值类型本身是线程安全的。它们不在线程之间共享–每个线程都将获得自己的数据副本,并可以在不影响其他线程的情况下随意操作该副本。每个副本都独立于其他副本,因此不会出现基于数据的竞赛条件。

结构体具有成员初始化功能,编译器会自动生成一个初始化器,为结构体的每个属性提供默认值

struct Person {
    var name: String
    var age: Int
    var favoriteIceCream: String
}

let taylor = Person(name: "Taylor Swift", age: 26, favoriteIceCream: "Chocolate")

为什么使用类

类具有继承的特性,继承现有类并在其基础上进行构建的能力。

Cocoa Touch 本身就是使用类编写的:UIKitSpriteKitMapKitCore Location 等都是面向对象的,NSCodingNSCopying 等协议也是如此。如果您编写的 Swift 代码需要与 CocoaCocoa Touch 配合使用,例如将自定义数据类型保存到UserDefaults 中,那么您很可能会在某些时候用到类。

结构体和类的抉择

选择结构体还是类,取决于您需要引用类型还是值类型行为。

  • 首先,使用值类型的一个主要原因是线程安全和避免竞赛条件。
  • 对象可以在应用程序的不同部分之间共享数据。
  • 类的另一大优势是可以通过继承另一个类来创建一个新类。

首先,尽可能选择结构体而不是类。如果你离不开继承,或者迫切需要共享数据所有权,那就使用类。

其次,如果你必须使用一个类,请声明它为final 类。这样做现在可以提高性能,但这也应该是你的默认立场:除非你特别考虑过 “是的,这个类可以被其他人子类化”,否则允许这种情况发生就是一个错误。不要低估健壮子类化的复杂性!

无论是结构还是类,尽可能将属性声明为常量。由于有了let关键字,Swift 中就有了不变性(不可更改的数据),这是一个值得保持的好习惯。

© 版权声明
THE END
喜欢就支持一下吧
点赞5 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容