【Swift技巧】如何使用Box共享Struct类型

2019-05-08  本文已影响0人  Lebron_James

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

上一篇下一篇

猜你喜欢

热点阅读