结构体和类

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/XuanTong520/article/details/79977724

结构体

使用 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

方法

属性分为类型方法实例方法

类型方法:简单说就是方法使用了staticclass关键字修饰,static修饰的不可以被重写

class Student {
    
    // 实例方法
    func test() {
        
    }
    
    // 类方法
    // 不可被重写
    static func printCount() {
        
    }
    
    // 可被重写
    class func printCount2() {
        
    }
}

  • 属性的监听

willSetdidSet方法

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"
* [ ] ```

#### 结构体和类的区别

* 结构体有注意构造器,类没有
* 结构体是值类型,类是引用类型
* 结构体不能继承,类可以


阅读更多
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页