Swift(一) 类与结构体

196 阅读3分钟

一、类和结构体的初始化

不论是用OC,还是swift开发,我们之前用的更多的是类,结构体很少用,我们先来看一下类和结构体的区别:

class LGTeacher{
    var age: Int
    var name: String

    init(age: Int, name: String) {
        self.age = age
        self.name = name
    }
}

struct LGTeacher{
    var age: Int
    var name: String

    init(age: Int, name: String) {
        self.age = age
        self.name = name
    }
}

从上面的代码来看,类和结构体在初始化时,很相似,那他们有什么相同点和区别呢?

类与结构体相同点

  1. 定义存储值的属性
  2. 定义方法
  3. 定义下标以使用下标语法提供对其值的访问
  4. 定义初始化器
  5. 使用 extension 来拓展功能
  6. 遵循协议来提供某种功能

类与结构体不同点

  1. 类有继承的特性,而结构体没有
  2. 在 Swift 中,类是引用类型,结构体是值类型。值类型在传递和赋值时将进行复制,而引用类型则只会使用引用对象的一个"指向"。
  3. 类有析构函数(deinit)用来释放其分配的资源
  4. 引用计数允许对一个类实例有多个引用
  5. 在内存中,引用类型诸如类是在堆上,而值类型诸如结构体是在栈上进行存储和操作。相比于栈上的操作,堆上的操作更加复杂耗时,所以一些官方推荐使用结构体,这样可以提高程序运行的效率。

如果没有其他额外的需求,只是用作存储数据,那么我们应该优先选择结构体,因为结构体在大量的创建性能优化上是比class优异的多,因为class需要去维护堆内存的创建,销毁,寻找,引用关系的创建等等,十分消耗性能

初始化:

结构体
struct LGTeacher{
    var age: Int
    var name: String

    //结构体会默认的给我们生成初始化器
//    init(age: Int, name: String) {
//        self.age = age
//        self.name = name
//    }
}

var t = LGTeacher.init(age: 18, name: "小明")

类

class LGTeacher{
    var age: Int
    var name: String

    //类必须我们手动创建初始化方法,不然会报错
    init(_ age: Int,_ name: String) {
        self.age = age
        self.name = name
    }
    
    init(Age age: Int,Name name: String) {
        self.age = age
        self.name = name
    }
    
    //便捷初始化器
    convenience init()
    {
        //需要调用当前类中的另一个初始化器
        self.init(18, "李老师")
    }
}

var t = LGTeacher.init(18, "小明")
var t1 = LGTeacher.init(Age: 18, Name: "小明")
var t12 = LGTeacher()

类的继承注意点

class Person{
    var age: Int
    var name: String
    
    init(_ age: Int,_ name: String) {
        self.age = age
        self.name = name
    }
}

class LGTeacher:Person{
   
    //子类中的属性不能和父类的相同
    var sex:Bool
    init(_ age: Int,_ name: String,_ sex:Bool) {
        //新添加的属性,需要在调用分类方法前先赋值
        self.sex = sex
      
        super.init(age, name)
        //子类继承与父类的属性赋值前要先初始化父类
        self.age = age
        self.name = name
    }
    
  
}

var t = LGTeacher.init(18, "小明", true)

二.类的生命周期

iOS开发的语言不管是OC还是Swift后端都是通过LLVM进行编译的,OC 通过 clang 编译器,编译成 IR,然后再生成可执行文件 .o(这里也就是我们的机器码) Swift 则是通过 Swift 编译器编译成 IR,然后在生成可执行文件。如下图所示:

图片.png