###枚举、类与结构体的对比### ####枚举与其他两者的关系#### 首先说枚举,相对比较好区分,因为我们知道,枚举与其他两者最大的相同之处就在于都可以定义方法
。
而其他的更多特性,对于枚举基本没有,没有属性,每一个枚举值都是常量。
并且,我们也知道,枚举中所定义的方法,也基于对本身值的操作,无法定义一些无关的属性和操作。
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. 结构不需要被另外一个类型继承或者完成其他行为 在其他情况下,类会是更好的选择。也就是说一般情况下,数据都会定义为类。