Swift5.2-结构体和类

2020-09-07  本文已影响0人  Gomu_iOS

一、声明

二、定义

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

三、初识结构体和类

结构和类具有相似的定义语法。
使用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("海贼王")
上一篇下一篇

猜你喜欢

热点阅读