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
因为incrementer
和incrementerCopy
都指向完全相同的闭包,因此也指向相同的捕获值。
为什么使用结构体
值类型是被复制而不是共享,如果代码中有三个不同的东西指向同一个结构体,它们将各自拥有自己的副本,不会出现互相干扰的情况。
值类型本身是线程安全的。它们不在线程之间共享–每个线程都将获得自己的数据副本,并可以在不影响其他线程的情况下随意操作该副本。每个副本都独立于其他副本,因此不会出现基于数据的竞赛条件。
结构体具有成员初始化功能,编译器会自动生成一个初始化器,为结构体的每个属性提供默认值
struct Person {
var name: String
var age: Int
var favoriteIceCream: String
}
let taylor = Person(name: "Taylor Swift", age: 26, favoriteIceCream: "Chocolate")
为什么使用类
类具有继承的特性,继承现有类并在其基础上进行构建的能力。
Cocoa Touch
本身就是使用类编写的:UIKit
、SpriteKit
、MapKit
、Core Location
等都是面向对象的,NSCoding
和NSCopying
等协议也是如此。如果您编写的 Swift 代码需要与 Cocoa
或 Cocoa Touch
配合使用,例如将自定义数据类型保存到UserDefaults
中,那么您很可能会在某些时候用到类。
结构体和类的抉择
选择结构体还是类,取决于您需要引用类型还是值类型行为。
- 首先,使用值类型的一个主要原因是线程安全和避免竞赛条件。
- 对象可以在应用程序的不同部分之间共享数据。
- 类的另一大优势是可以通过继承另一个类来创建一个新类。
首先,尽可能选择结构体而不是类。如果你离不开继承,或者迫切需要共享数据所有权,那就使用类。
其次,如果你必须使用一个类,请声明它为final
类。这样做现在可以提高性能,但这也应该是你的默认立场:除非你特别考虑过 “是的,这个类可以被其他人子类化”,否则允许这种情况发生就是一个错误。不要低估健壮子类化的复杂性!
无论是结构还是类,尽可能将属性声明为常量。由于有了let
关键字,Swift 中就有了不变性(不可更改的数据),这是一个值得保持的好习惯。
暂无评论内容