###枚举、类与结构体的对比### ####枚举与其他两者的关系#### 首先说枚举,相对比较好区分,因为我们知道,枚举与其他两者最大的相同之处就在于都可以定义方法 。 而其他的更多特性,对于枚举基本没有,没有属性,每一个枚举值都是常量。 并且,我们也知道,枚举中所定义的方法,也基于对本身值的操作,无法定义一些无关的属性和操作。
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. 结构不需要被另外一个类型继承或者完成其他行为 在其他情况下,类会是更好的选择。也就是说一般情况下,数据都会定义为类。 (编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|