[Swift]枚举、类与结构体的对比

前端之家收集整理的这篇文章主要介绍了[Swift]枚举、类与结构体的对比前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

###枚举、类与结构体的对比### ####枚举与其他两者的关系####   首先说枚举,相对比较好区分,因为我们知道,枚举与其他两者最大的相同之处就在于都可以定义方法
  而其他的更多特性,对于枚举基本没有,没有属性,每一个枚举值都是常量。
并且,我们也知道,枚举中所定义的方法,也基于对本身值的操作,无法定义一些无关的属性和操作。

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)

  上面这个例子很好地说明了结构体和类的一些相同之处和不同之处。
  可以看到,类、结构体在定义、初始化方法属性定义等方面几乎完全相同,classstruct关键字可以互换。
  但是我们同时又看到,将各自的对象赋值给新值,对新值进行修改之后,类的老值也跟着变化,而结构体的老值则没有发生改变。
  
  可见,类的赋值是传引用,而结构体则是传值。
  值类型与引用类型除了上面这种修改方式,导致不同的结构,还有一个比较方式也不同。比如两个结构体,只要属性值相同,我们就可以认为结构体相同,是同一个结构体。而两个类的对象,光是属性值相同,并不一定相同,不一定是类的同一个对象。
  
  那什么时候应该使用结构体,什么时候应该使用类呢?
  在代码中可以选择类或者结构来实现你所需要的代码块,完成相应的功能。但是结构实例传递的是值,而类实例传递的是引用。那么对于不同的任务,应该考虑到数据结构和功能的需求不同,从而选择不同的实例。
  一般来说,下面的一个或多个条件满足时,应当选择创建一个结构:   1. 结构主要是用来封装一些简单的数据值   2. 当赋值或者传递的时候更希望这些封装的数据被赋值,而不是被引用过去   3. 所有被结构存储的属性本身也是数值类型   4. 结构不需要被另外一个类型继承或者完成其他行为  在其他情况下,类会是更好的选择。也就是说一般情况下,数据都会定义为类。

猜你在找的Swift相关文章