结构体
使用 struct
声明。
由一系列具有相同类型或不同类型的数据构成的数据集合。是一种数据结构。是值类型,在方法中传递的时候是值传递。
无论枚举还是结构体重都可以定义方法
struct Point {
// 实例属性
var x: Double
var y: Double
// 实例方法
func distance() {
print("计算两点接的距离")
}
// 类型属性
var z: Double = 0
// 类型方法
static func dis() {
print("计算两点接的距离")
}
}
let s = Point(x: 2, y: 3)
s.distance()
Point.dis()
Point.z
结构体扩充构造函数
- 自定义构造函数不是普通函数
- 不加 func,必须使用 init
- 在构造函数内部,所有非可选属性必须有值
- 如果自定义了构造函数,那系统的逐一构造函数就会消失
struct Point {
var x: Double
var y: Double
var z: Double
init(x: Double, y: Double) {
self.x = x
self.y = y
z = 0
}
}
// 系统提供的构造函数
let p = Point(x: 0, y: 0)
结构体扩充函数
一般是两种函数,类型函数
和实例函数
两种扩充
默认情况下,实例函数里面无法修改实例属性,使用 mutating
关键字才可以改变
struct Point {
// 非可选
var x: Double
var y: Double
// 类型函数
static var shiliCount = 0
static func count() {
print("当前有\(shiliCount)个实例")
}
init(x: Double, y: Double) {
self.x = x;
self.y = y
Point.shiliCount += 1
}
// 实例函数
// 默认情况下,实例函数里面无法修改实例属性,使用 mutating 关键字才可以改变
mutating func moveX(xDis: Double) {
self.x = xDis
print("在x轴上移动\(xDis)")
}
}
let p = Point(x: 1, y: 2)
结构体扩充系统结构体
可以使用 关键字extension
扩展系统结构体
extension CGPoint {
mutating func moveX(xD: CGFloat) {
self.x += xD
}
}
var pc = CGPoint(x: 1, y: 1)
pc.moveX(xD: 3)
类
使用 class
关键字标识。
类可以写属性和方法,同样属性可以分为实例属性
和类型属性
。方法分为实例方法
和类型方法
。
- 类在默认情况下不会生成逐一构造器(为了保证所有的非可选属性有值)
- 当一个实例对象被创建后,所有的非可选属性都有值
- 类可以不继承父类
- 使用
override
关键字重写方法
class Person {
var name: String
var age: Int?
init() {
self.name = "";
}
init(name: String) {
self.name = name
}
}
Person()
Person(name: "ddd")
类的析构函数
等于Objective-C中的delloc
函数
```
deinit {
}
```
类和结构体的属性和方法
属性
属性分为类型属性
和实例属性
类型属性
:简单说就是属性中使用了static
关键字修饰
实例属性
:包含存储属性
和计算属性
存储属性
:直接用来存储的属性
计算属性
:通过某些计算得到的数值, 只有get
方法,没有set
方法。get
关键字还可以省略
class Student {
// 类型属性
static var personCount: Int = 0
// 实例属性(存储属性、计算属性)
// 存储属性
var name: String?
var age: Int = 0
var score1: Double = 0
var score2: Double = 0
// 计算属性
var avgScore: Double {
// get {
return (score1 + score2) / 2
// }
}
init() {
}
deinit {
}
}
Student().avgScore
方法
属性分为类型方法
和实例方法
类型方法
:简单说就是方法使用了static
或class
关键字修饰,static
修饰的不可以被重写
class Student {
// 实例方法
func test() {
}
// 类方法
// 不可被重写
static func printCount() {
}
// 可被重写
class func printCount2() {
}
}
- 属性的监听
willSet
和didSet
方法
class Person {
var name: String = "" {
willSet(newName) {
name // 旧的数值
newName // 新的数值
}
didSet(oldName) {
oldName // 旧的数值
name // 新的数值
}
}
var aveScore: Double {
get {
return 2.2
}
set {
newValue
}
}
var age: Int = 0
}
let person = Person()
person.name = "xx"
* [ ] ```
#### 结构体和类的区别
* 结构体有注意构造器,类没有
* 结构体是值类型,类是引用类型
* 结构体不能继承,类可以