美文网首页
【Swift技巧】如何使用Box共享Struct类型

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

作者: Lebron_James | 来源:发表于2019-05-08 08:47 被阅读0次

    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

    相关文章

      网友评论

          本文标题:【Swift技巧】如何使用Box共享Struct类型

          本文链接:https://www.haomeiwen.com/subject/hlrjoqtx.html