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 中类和结构体有很多共同点。共同处在于:
- 定义属性用于存储值
- 定义方法用于提供功能
- 定义附属脚本用于访问值
- 定义构造器用于生成初始化值
- 通过扩展以增加默认实现的功能
- 符合协议以对某类提供标准功能
与结构体相比,类还有如下的附加功能:
- 继承允许一个类继承另一个类的特征
- 类型转换允许在运行时检查和解释一个类实例的类型
- 解构器允许一个类实例释放任何其所被分配的资源
- 引用计数允许对一个类的多次引用
网友评论