Swift-类

Swift类是构建代码所用的一种通用且灵活的构造体,可以为类定义属性(常量、变量)和方法。与其他变成语言所不同的是swift并不要求为自定义类去创建独立的接口和实现文件,你所要做的是在一个单一文件中定义一个类,系统会自动生成面向其他代码的外部接口

类和结构体对比

共同点:

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

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

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

语法

1
2
3
4
5
6
class className {
definition 1
definition 2
...
definition N
}

类定义

1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Student{
// 如果定义属性的时候没有初始化,那么必须在后面写上一个?
// swift要求属性必须有初始值的
// 只要在构造方法中对属性进行了初始化,那么就不用写?
var name: String?
/*
如果是定义一个“对象属性”,那么后面可以写上?
如果一定一个“基本数据类型属性”, 那么建议直接赋值0
因为super.init()方法在分配存储空间的时候,如果发现属性是一个对象,并且是一个可选类型,那么会给属性分配存储空间。
但是如果属性是一个基本数据类型,并且可选类型,那么super.init()不会给该属性分配存储空间。例如:var age: Int?
*/

var age: Int = 0
var height: Double = 0.0
}

类实例

1
let student1 = Student()

构造方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// 注意:如果自定义了构造方法,并且没有重写父类默认的构造方法,那么默认的构造方法就会失效
override init(){
self.name = "dasike"
self.age = 26
}

/*自定义构造方法,swift中有方法重载的概念,允许有同名的方法,只要形参或返回值不一样即可*/
init(name:String, age:Int){
self.name = name
self.age = age
}

init(dict:[String:NSObject]{
super.init()
/*注意点:swift中如果想在构造方法中使用KVC给属性赋值,那么在使用KVC之前必须抵用super.init(),调用super.init()的目的就是为了能在KVC赋值之前给属性分配存储空间
setValuesForKeys(dict)
}

访问属性

1
2
let student1 = Student.init(name: "daisuke", age: 10)
print("name:\(student1.name), age:\(student1.age)")

恒等运算符

因为类是引用类型,有可能多个常量和变量在后台同事引用某一个实例,为了能够判断两个常量或者变量时候引用同一个类实例,swift内建了两个恒等运算符

横等运算符 不恒等运算符
运算符为:=== 运算符为:!==
如果两个常量或者变量引用同一个类实例则返回true 如果两个常量或者变量引用不同一个类实例则返回true
1
2
3
4
5
6
7
8
9
10
let stu1 = Student.init(name: "daisuke", age: 10)
let stu2 = Student.init(name: "daisuke", age: 10)
if stu1 === stu2 { // false
print("引用相同的类实例")
}

if stu1 !== stu2 {// true
print("引用不相同的类实例")
}
// 引用不相同的类实例