Swift開發(fā)者應(yīng)該都知道揩悄,很多Swift的類型都是值類型,例如字符串焕窝、數(shù)字蹬挺、數(shù)組、字典它掂、集合巴帮、結(jié)構(gòu)、多元組虐秋、枚舉等榕茧。值類型在Swift中可以說是無處不在。
在開發(fā)過程中客给,我們也是盡可能地優(yōu)先考慮使用Struct類型用押,而不是Class類型,讓我們更容易理解靶剑、測試和調(diào)試代碼蜻拨。有時候我們確實需要在整個應(yīng)用中共享某個類型的數(shù)據(jù),這時我們可以考慮用Class抬虽。但是如果我們并不想這個類型總是在整個應(yīng)用中共享官觅,而是在某些需求要共享,這時我們還是可以把這個類型定義為Struct阐污,而在需要共享的時候把它裝在一個Class類型的箱子里面休涤,通過這個箱子來共享。下面我們來看一個例子笛辟。
Demo
假設(shè)我們有一個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
賦值給其他變量手幢,它會復制一份數(shù)據(jù)給其他變量捷凄,不管如何更改變量的屬性,也不會影響到其他變量围来。
現(xiàn)在我們想要共享User
跺涤,我們先定義一個UserBox
:
final class UserBox {
let user: User
init(user: User) {
self.user = user
}
}
然后初始化一個lebronBox1
匈睁,并把lebronBox1
賦值給lebronBox2
;打印兩個變量的name桶错;修改其中一個變量的name
航唆,然后再打印一次,結(jié)果如下:
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)")
// 結(jié)果:
lebronBox1: Lebron James
lebronBox2: Lebron James
lebronBox1: kevin Love
lebronBox2: kevin Love
我們可以看到院刁,修改了其中一個變量的name
糯钙,影響到了另外一個變量。成功實現(xiàn)了Struct類型的共享退腥。
另外任岸,為了打造一個通用的箱子,我們可以使用泛型:
final class Box<T> {
var value: T
init(value: T) {
self.value = value
}
}
這樣我們就可以用這個通用的箱子來共享其他Struct類型狡刘。
總結(jié)
在開發(fā)過程中享潜,我們應(yīng)該盡可能的使用Struct類型,在某些時候需要共享的時使用Box把它裝起來颓帝。在必須用Class的時候才用Class米碰。
如果想第一時間關(guān)注我的文章,可以拉到最下面訂閱我的博客购城,并記得在郵件中確認訂閱。謝謝虐译!
歡迎加入我管理的Swift開發(fā)群:536353151
瘪板。