美文网首页
Swift5.2-结构体和类

Swift5.2-结构体和类

作者: Gomu_iOS | 来源:发表于2020-09-07 15:54 被阅读0次

    一、声明

    • 内容仅作为博主个人学习的一个总结输出,仅供参考,若对你产生了一丝帮助,荣幸之至。

    二、定义

    结构体和类是多功能的,灵活的结构,是程序中代码的构建块。我们可以使用与定义常量,变量和函数相同的语法来定义属性和方法,为我们的结构体和类添加功能。

    • 比较结构体和类
      • 相同点:
        1. 定义存储值的属性
        2. 定义提供功能的方法
        3. 定义下标以使用下标语法提供对其值进行访问
        4. 定义初始化方法以设置其初始状态
        5. 可以被扩展 extend,在函数的默认实现的基础上可以扩展其功能。
        6. 可以遵守协议以提供某种标准功能

      • 类具有结构体所没有的附加功能:
        1. 继承:一个类能够继承另一个类的特性。
        2. 类型转换:在运行时检查和解释类的实例对象所属类型。
        3. 析构函数(Deinitializers):允许类的实例对象释放它已分配的任何资源。
        4. 引用计数:允许对类实例进行多个引用。

    三、初识结构体和类

    • 语法定义

    结构和类具有相似的定义语法。
    使用struct关键字定义一个结构体。
    使用class关键字定义类。

    struct myStruct {
    }
    
    class myClass {
    }
    

    结构体和类的实例

    struct myStruct {
        var width = 10
        var height = 20
    }
    class myClass {
        var st = myStruct()
        var haveCar = true
        var point = 10.0
        var name :String?
    }
    let my_Struct = myStruct()
    let my_Class = myClass()
    

    属性访问(取值)

    let width1 = my_Struct.width
    let width2 = my_Class.st.width
    

    属性访问(赋值)
    注意:给结构体赋值需要将my_Struct改成var,类不需要

    my_Struct.height = 30
    my_Class.name = "Gomu"
    my_Class.point = 9.0
    

    结构体类型的成员初始化方法,类没有

    var my_Struct = myStruct(width: <#T##Int#>, height: <#T##Int#>)
    

    结构体和枚举是值类型
    类似Swift中的整数,浮点数,布尔值,字符串,数组和字典,都是值类型的,并且这些类型在Swift中的实现都是基于结构体的。故所有结构体和枚举值类型都是值类型。这意味着我们创建的任何结构体和枚举实例以及作为它们属性的任何值类型,在代码中传递时始终会被复制。
    注意:标准库定义的集合,如:数组,字典和字符串使用优化来降低复制的性能成本。这些集合类型不是立即复制,而是共享内存,其元素存储在原始实例和任何副本之间。如果需要修改集合的其中一个副本,则会在修改之前复制集合中的所有元素。但是我们在代码中看到的好像总是立即发生了复制。

    var my_Struct = myStruct(width: 13, height: 33)
    var my_Struct1 = my_Struct
    //: 在这个赋值的过程中,由于myStruct是值类型的,所以首先会生成my_Struct实例的副本并将此副本赋值给my_Struct1。此时my_Struct和my_Struct1具有相同的宽度和高度,但是却是两个不同的实例。
    my_Struct1.height = 22
    //: my_Struct和my_Struct1是两个单独的实例,所以修改副本my_Struct1的属性width,并不会影响my_Struct的width。
    //: 枚举类型也是值类型,具有和结构体一样的赋值特性:复制
    
    enum CompassPoint {
        case north, south, east, west
         //: 使用mutating关键字放在枚举或结构体中所定义方法的func关键字之前,使得该方法可以在方法中修改枚举或结构体的属性。
         mutating func turnNorth() -> Void {
            self = .north
        }
    }
    var currentDirection = CompassPoint.west
    let rememberedDirection = currentDirection
    currentDirection.turnNorth()
    
    print("当前的方向,被改变后 \(currentDirection)")//: 当前的方向,被改变后 north
    print("保存的方向 \(rememberedDirection)")//: 保存的方向 west
    //: 当currentDirection赋值给rememberedDirection时,rememberedDirection拥有的是currentDirection实例的副本。此后更改currentDirection的值不会影响存储在rememberedDirection中值。因为彼此独立。
    

    类是引用类型的
    与值类型不同,引用类型在分配给变量或常量时或者传递给函数时不会被复制,而是使用对同一实例的引用。

    let my_Struct = myStruct(width: 13, height: 33)
    let my_Class = myClass()
    my_Class.st = my_Struct
    my_Class.haveCar = false
    my_Class.name = "Gomu"
    my_Class.point = 11.0
    //: 赋值给新的示例对象
    let new_Class = my_Class
    new_Class.name = "海贼王"
    print(my_Class.name,new_Class.name)
    //: Optional("海贼王") Optional("海贼王")
    

    相关文章

      网友评论

          本文标题:Swift5.2-结构体和类

          本文链接:https://www.haomeiwen.com/subject/gywzsktx.html