美文网首页
Swift中 enum,struct,class总结

Swift中 enum,struct,class总结

作者: mkvege | 来源:发表于2018-05-11 15:51 被阅读30次

swift中的枚举和结构体都比OC中增加了一定的灵活性,但本质并未改变

1. 枚举

定义方式和OC略有不同,前面要加case

enum DaysofaWeek {
    case Sunday
    case Monday
    case TUESDAY
    case WEDNESDAY
    case THURSDAY
    case FRIDAY
    case Saturday
}

与OC的区别是这个DaysofaWeek枚举的值并不是默认Int型,而是这些枚举成员的本身就是一个完整的值,例如DaysofaWeek. Sunday就是一个值。

当然如果想要像oc一样给枚举附值也是可以的

enum Month: Int {
    case January = 1, February, March, April, May, June, July, August, September, October, November, December
}

Month 为Int类型,给第一个赋值1,后面会默认递增,这一点与OC相同,不同的是Month也可以设置为String类型,如果没有设置初始值,系统会以变量名作为默认String值。

枚举增加了一个更灵活的操作
enum Student{
    case Name(String)
    case Mark(Int,Int,Int)
}
var studDetails = Student.Name("Runoob")
var studMarks = Student.Mark(98,97,95)
switch studMarks {
case .Name(let studName):
    print("学生的名字是: \(studName)。")
case .Mark(let Mark1, let Mark2, let Mark3):
    print("学生的成绩是: \(Mark1),\(Mark2),\(Mark3)。")
}

可以指定不同的枚举类型,并且在定义时不直接赋值,在初始化时赋值,在switch时可以获取到其初始化的值。
这样可以在枚举中定义的更加详细,逻辑代码中将更加简化。

值得一提的是OC中经常与NS_ENUM共同出现的NS_OPTIONS在swift中被遵循OptionSet协议的结构体替代。

2.结构体和类

swift中的struct不同于C,其具有一些OC中class才有的功能,所以要struct和class对比学习。卓同学在《4道过滤菜鸟的面试题中》曾以这道题为面试题,所以可知其重要性。

结构体的总结:

1. 结构体的主要目的是用来封装少量相关简单数据值。
2. 有理由预计一个结构体实例在赋值或传递时,封装的数据将会被拷贝而不是被引用。
3. 任何在结构体中储存的值类型属性,也将会被拷贝,而不是被引用。
4. 结构体不需要去继承另一个已存在类型的属性或者行为。

以CGRect为例,在OC中除了定义该结构体基本数据外外,其他方法均要调用C来实现,例如

CGRectEqualToRect(CGRect rect1, CGRect rect2)

而swift较为柔和的处理的这个问题,在struct内部可以实现方法,不需要调用C语言的突兀,例如CGRect结构体中

@available(iOS 2.0, *)
 public func equalTo(_ rect2: CGRect) -> Bool

类和结构体的对比

Swift 中类和结构体有很多共同点。共同处在于:

  • 定义属性用于存储值
  • 定义方法用于提供功能
  • 定义附属脚本用于访问值
  • 定义构造器用于生成初始化值
  • 通过扩展以增加默认实现的功能
  • 符合协议以对某类提供标准功能

与结构体相比,类还有如下的附加功能:

  • 继承允许一个类继承另一个类的特征
  • 类型转换允许在运行时检查和解释一个类实例的类型
  • 解构器允许一个类实例释放任何其所被分配的资源
  • 引用计数允许对一个类的多次引用

总之不管结构体增加了多少功能,里面装的都是基本数据类型,它始终是值拷贝,而不是指针引用。

相关文章

网友评论

      本文标题:Swift中 enum,struct,class总结

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