###枚举、类与结构体的对比### ####枚举与其他两者的关系#### 首先说枚举,相对比较好区分,因为我们知道,枚举与其他两者最大的相同之处就在于都可以定义方法
。
而其他的更多特性,对于枚举基本没有,没有属性,每一个枚举值都是常量。
并且,我们也知道,枚举中所定义的方法,也基于对本身值的操作,无法定义一些无关的属性和操作。
- enum Animation2048Type{
- case None //无动画
- case New //新出现动画
- case Merge //合并动画
- func description()->String{
- switch(self){
- case .None:
- return "无动画"
- case .New:
- return "新出现动画"
- case .Merge:
- return "合并动画"
- }
- }
- }
- print(Animation2048Type.Merge.description())
####类与结构体的关系#### 类和结构体则相同之处,多于不同之处,甚至在一些情况下,把struct
关键字修改为class
都不会带来编译错误。
比如下标脚本一节中Matrix类,我们可以方便地切换为struct
类型。
它们的共同点
如下:
1. 都可以定义一些可以复制的属性。
属性的类型和写法大多相同。当然也有不同,比如类型属性的写法,在类中用class
前缀,在结构体中用static
前缀修饰。
2. 都可以定义具有功能性的方法。
可定义方法类型也大多相同,但正如属性,对于类型方法的定义,在类中用class
前缀,在结构体中用static
前缀修饰。
3. 都可以定义下标脚本,使用下标语法。
4. 都可以定义初始化方法来设置初始状态,初始化属性
5. 都可以做扩展实现
当然两者还是有一些不同
之处:
1. 在数据结构的扩展和继承方面,类更加强大。
2. 我们可以让一个类的实例来执行反初始化方法,使其释放存储空间,但是结构体做不到。
3. 类的对象是引用类型,而结构体是值类型
可以用下面的这个例子看一下:
- class People{
- var name=""
- init(name:String)
- {
- self.name = name
- }
- }
- struct Human{
- var name=""
- init(name:String)
- {
- self.name = name
- }
- }
- var xw = People(name: "xiaowang")
- print(xw.name)
- var p = xw;
- p.name = "xiaoping"
- print(xw.name)
- var lm = Human(name: "liming")
- print(lm.name)
- var l = lm
- l.name = "liliang"
- print(lm.name)
上面这个例子很好地说明了结构体和类的一些相同之处和不同之处。
可以看到,类、结构体在定义、初始化方法、属性定义等方面几乎完全相同,class
和struct
关键字可以互换。
但是我们同时又看到,将各自的对象赋值给新值,对新值进行修改之后,类的老值也跟着变化,而结构体的老值则没有发生改变。
可见,类的赋值是传引用,而结构体则是传值。
值类型与引用类型除了上面这种修改方式,导致不同的结构,还有一个比较方式也不同。比如两个结构体,只要属性值相同,我们就可以认为结构体相同,是同一个结构体。而两个类的对象,光是属性值相同,并不一定相同,不一定是类的同一个对象。
那什么时候应该使用结构体,什么时候应该使用类呢?
在代码中可以选择类或者结构来实现你所需要的代码块,完成相应的功能。但是结构实例传递的是值,而类实例传递的是引用。那么对于不同的任务,应该考虑到数据结构和功能的需求不同,从而选择不同的实例。
一般来说,下面的一个或多个条件满足时,应当选择创建一个结构: 1. 结构主要是用来封装一些简单的数据值 2. 当赋值或者传递的时候更希望这些封装的数据被赋值,而不是被引用过去 3. 所有被结构存储的属性本身也是数值类型 4. 结构不需要被另外一个类型继承或者完成其他行为 在其他情况下,类会是更好的选择。也就是说一般情况下,数据都会定义为类。