美文网首页
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-结构体和类

    一、声明 内容仅作为博主个人学习的一个总结输出,仅供参考,若对你产生了一丝帮助,荣幸之至。 二、定义 结构体和类是...

  • 类和结构体

    类与结构体 本节内容包括: 类和结构体对比 结构体和枚举是值类型 类是引用类型 类和结构体的选择 集合类型的赋值与...

  • Swift Tour Learn (六) -- Swift 语法

    Swift语法基础(五)-- (类和结构体、属性、方法) 本章将会介绍 类和结构体对比结构体和枚举是值类型类是引用...

  • swift基础_结构体和类

    一.结构体和类 结构体张这个样子 类张这个样子 二.结构体和类的区别 针对结构体, 即使你没有定义函数,编译器也会...

  • Day9 类和结构体

    本页包含内容:• 类和结构体对比• 结构体和枚举是值类型• 类是引用类型• 类和结构体的选择• 字符串、数组、和字...

  • Swift学习_基本语法之枚举&类&结构体

    1.枚举 类和结构体 在swift中类和结构体类似,可以把结构体理解成是一种轻量级的类,在swift中结构体不仅可...

  • swift面向对象特性——类和结构体

    类和结构体的定义 类的语法格式为: 结构体的语法格式为: Swift中类和结构体的名称都以大写字母开头。类的方法和...

  • SwiftUI-结构体与类

    一.结构体与类 结构体和类都可以使用属性和方法构建复杂数据类型,但是什么时候使用结构体,什么时候使用类呢?结构体和...

  • Swift5.1类和结构体

    9.类和结构体 结构体和类相比Swift中结构体和类的共同点:- 定义属性⽤于存储值- 定义方法⽤于提供功能- 定...

  • Swift笔记<十五>结构体和类的区别

    结构体和类的区别 结构体有逐一构造器,类没有 结构体是值类型,类是引用类型 结构体不是继承(意味着没有多态)

网友评论

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

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