Swift开发者应该都知道,很多Swift的类型都是值类型,例如字符串、数字、数组、字典、集合、结构、多元组、枚举等。值类型在Swift中可以说是无处不在。
在开发过程中,我们也是尽可能地优先考虑使用Struct类型,而不是Class类型,让我们更容易理解、测试和调试代码。有时候我们确实需要在整个应用中共享某个类型的数据,这时我们可以考虑用Class。但是如果我们并不想这个类型总是在整个应用中共享,而是在某些需求要共享,这时我们还是可以把这个类型定义为Struct,而在需要共享的时候把它装在一个Class类型的箱子里面,通过这个箱子来共享。下面我们来看一个例子。
Demo
假设我们有一个User
,定义为Struct类型:
enum Gender {
case male
case female
}
struct User {
var name: String
var age: Int
var gender: Gender
}
let lebron = User(name: "Lebron James", age: 34, gender: .male)
因为Struct是值类型,所以如果你把lebron
赋值给其他变量,它会复制一份数据给其他变量,不管如何更改变量的属性,也不会影响到其他变量。
现在我们想要共享User
,我们先定义一个UserBox
:
final class UserBox {
let user: User
init(user: User) {
self.user = user
}
}
然后初始化一个lebronBox1
,并把lebronBox1
赋值给lebronBox2
;打印两个变量的name;修改其中一个变量的name
,然后再打印一次,结果如下:
let lebronBox1 = UserBox(user: lebron)
let lebronBox2 = lebronBox1
print("lebronBox1: \(lebronBox1.user.name)")
print("lebronBox2: \(lebronBox2.user.name)")
lebronBox2.user.name = "kevin Love"
print("lebronBox1: \(lebronBox1.user.name)")
print("lebronBox2: \(lebronBox2.user.name)")
// 结果:
lebronBox1: Lebron James
lebronBox2: Lebron James
lebronBox1: kevin Love
lebronBox2: kevin Love
我们可以看到,修改了其中一个变量的name
,影响到了另外一个变量。成功实现了Struct类型的共享。
另外,为了打造一个通用的箱子,我们可以使用泛型:
final class Box<T> {
var value: T
init(value: T) {
self.value = value
}
}
这样我们就可以用这个通用的箱子来共享其他Struct类型。
总结
在开发过程中,我们应该尽可能的使用Struct类型,在某些时候需要共享的时使用Box把它装起来。在必须用Class的时候才用Class。
如果想第一时间关注我的文章,可以拉到最下面订阅我的博客,并记得在邮件中确认订阅。谢谢!
欢迎加入我管理的Swift开发群:536353151
。