1、类概念
类是一种抽象的概念,它实际上并不存在于现实中的时间和空间里。
- 在定义一个类时,我们就会在类中定义该类事物的特性和行为,从术语上讲,特性叫类的属性,行为叫类的方法。
- 类是一个静态的概念,类本身不携带任何数据。
- 当没有为类创建任何对象时,类本身不存在于内存空间中。
在 OC 中创建类时,会得到两个文件:一个接口文件(.h 文件)和一个实现文件(.m 文件)。而在 Swift 中生成类时,只有一个文件 .swift 文件。
// 定义类class Student { var name: String = "" var age: Int = 10}
// 创建类实例let classItem = Student()
- 定义类时使用
class
关键字,上面的类中有两个属性,并且都声明了类型,做了初始化。 - 创建类实例时使用了
let
关键字声明,表达了不希望类被改变的意图,但是只要不改变类的指针,仍可以随意修改类中的属性。
- 定义类时使用
1.1 Swift 中类与结构体的关系
它们的共同点如下
- 1)都可以定义一些可以赋值的属性。属性的类型和写法大多相同。当然也有不同,比如类型属性的写法,在类中用 class 前缀,在结构体中用 static 前缀修饰。
- 2)都可以定义具有功能性的方法。可定义方法类型也大多相同。但正如属性,对于类型方法的定义,在类中用 class 前缀,在结构体中用 static 前缀修饰。
- 3)都可以定义下标脚本,使用下标语法。
- 4)都可以定义初始化方法来设置初始状态,初始化属性。
- 5)都可以做扩展实现。
它们的不同点如下
- 1)在数据结构的扩展和继承方面,类更加强大。
- 2)我们可以让一个类的实例来反初始化,适时释放存储空间,但是结构体做不到。
- 3)类的对象是引用类型,而结构体是值类型。
从上面可以看出类和结构体在定义、初始化方法、属性定义等方面几乎完全相同,class 和 struct 关键字可以互换。
- 但类的赋值是传引,而结构体则是传值。
- 两个结构体,只要属性值都相同,我们就可以认为结构体相同,是同一个结构体。
- 而两个类的对象,光是属性值相同,并不一定相同,不一定是类的同一个对象。
一般来说,下面的一个或多个条件满足时,应当选择创建一个结构体
- 1)结构主要是用来封装一些简单的数据值。
- 2)当复制或者传递的时候更希望这些封装的数据被赋值,而不是被引用过去。
- 3)所有被结构存储的属性本身也是数字类型。
- 4)结构不需要被另外一个类型继承或者完成其他行为。
用类会是更好的选择。也就是说一般情况下,数据都会定义为类。
2、类组合
在面向对象的设计原则中,有一条叫 “组合优先于继承”。
组合就是在已有的类或者模块上实现一个新功能时,可以通过在新的类里实现新功能,同时在新的类里,调用或者组合已有的对象,两者联合在一起实现功能。既是说一个类的某一属性是另一个类的实例。
白箱复用:继承时子类继承父类,子类就拥有了父类所有相关的属性和方法,也就是说父类的实现细节,对于子类其实是可见的。使用继承的目的是为了代码复用,这种复用方式叫 “白箱复用”。
黑箱复用:组合是通过对象的方式访问已有的类的功能。在类中,可以封装的比较彻底,类所暴露出来的接口和属性是相当有限的,在调用时也不需要明白类的实现细节,这种复用方式叫 “黑箱复用”。
3、类前缀
在开发 iOS 程序时,最好在每个类名前面加一个前缀,用来标识这个类。
- 目的是防止 N 个人开发了一样的类,出现冲突。
比如 Jake Will、Kate Room 在同一个项目中都各自开发了个
Button
类,这样的程序是不能运行起来的。- 解决方案:Jake Will 的类名叫做
JWButton
,Kate Room 的类名叫做KRButton
。
- 解决方案:Jake Will 的类名叫做
类前缀的设置
Xcode 6 之后
创建完项目后设置。
设置完后,再创建新的文件时会自动添加上设置的类前缀。