Swift 类和结构体总结

类和结构体都是多功能而且灵活的结构,它们可以作为构建块(building block)在代码中使用。你可以为类和结构体定义属性和方法来扩充它们的功能。对于自定义类,Swift不需要你创建单独的接口和文件来实现类和接口,你在一个文件中定义和实现类和结构体即可。

类和结构体的比较

类和结构体有很多相似之处:

• 定义存储值的属性
• 定义方法提供功能
• 定义下标,通过下标语法访问元素的值
• 定义初始化器来初始化状态
• 可以服从特定的协议提供标准功能

类还有一些结构体没有的功能:

• 继承使得一个类能够继承其他类的属性
• 类型转化能够让你在运行时检查和解释类实例的类型
• 类的解析(Deinitializer)能够释放类实例分配到的任何资源
• 引用计数允许一个类实例有一个或者多个引用

类和结构体定义

相比于C语言,Swift 的结构体强大了很多,可以有方法,构造方法等。使用struct关键字来定义一个结构体,使用class关键字来定义一个类,定义的主体位于一个花括号中。语法:

    struct structName {var varity: Type1var varity1: Type2}class SomeClass{//class definition goes here}如: struct Rect{var height: Doublevar width: Double}struct Resolution{var width = 0var height = 0}class VideoMode {var resolution = Resolution()var interlaced = falsevar frameRate = 0.0var name: String?}

结构体和类的定义中,由于创建了新的类型,所以类和结构体的名称采用首字母大写的驼峰标识,而属性和方法则采用首字母小写的驼峰标识。

类和结构体实例

类和结构体的定义仅仅是提供了一个模板,说明这些实例应该长这样子的。比如Resolution提供了一个分辨率的模板,而VideoMode则提供了一个视频模式的模板。如果要使用类和结构体,则还需要实例化类和结构体产生实例。类和结构体实例化的语法都非常类似:

    let someResolutio = Resolution()let someVideoMode = VideoMode()

这是最简单的实例化方式,使用类或结构体的名字外加一个括号即可。

访问属性

我们采用“.”来访问实例的属性。如下面所示:

    struct Rect{var height: Double = 0.0var width: Double = 0.0}//实例化:var rect: Rect = Rect()rect.height = 10.0rect.width = 20.0 //为实例变量赋值

跟Objective-C不一样,Swift可以让你直接访问属性的属性,如上面的VideoMode这个类有一个结构体实例,可以直接访问这个实例的属性。

    someVideoMode.resolution.height = 960someVideoMode.resolution.width = 1280

结构体的构造器

构造器的作用不是分配内存,而是系统给分配内存之后,自动调用构造器方法,进行初始化内存,初始化成员变量。所以,构造器主要分两种,一种是构造结构体时指定所有成员变量的初始值,此时不用带参数,如 var rect: Rect = Rect();第二种是逐一成员构造器,因为成员变量在构造结构体的时候没有初始化,如:

struct Rect{
var height: Doublevar width: Double
}
var rect = Rect(height: 10.0, width: 20.0) //注意,height和width的顺序不能调换

结构体和枚举类型是值类型

值类型意味着在给一个变量或者常量赋值或者传递给函数的时候采用的是拷贝的方式。在以前所接触到的类型Int、Float、Double、Bool、String、Array、Dictionary等都是值类型。在Swift中所有的结构体和枚举类型都是结构体。可以看看以下示例:

var highResolution = Resolution(width: 1920, height: 1080)
var cinema = highResolution
//改变cinema的一个的属性
cinema.width = 2048
//highResolution 的属性并没有改变,所以是值传递
print("highResolution: (width: \(highResolution.width), height: \(highResolution.height))")
输出结果为:
highResolution: (width: 1920, height: 1080)
Program ended with exit code: 0
    enum CompassPoint {case north, south, east, west}var currentDirection = CompassPoint.eastvar anotherDirection = currentDirectionanotherDirection = .westif(currentDirection == .east){print("current direction is still east")}
输出结果为:
current direction is still east
Program ended with exit code: 0

说明枚举类型的赋值也是值传递,采用的是拷贝方式。

类是引用类型

引用类型是当赋值给变量或者常量或者传递给函数时不会采用值拷贝,而是采用引用传递的方式,多个变量或者常量指向同一个实例。

let tenEighty = VideoMode()
tenEighty.resolution = highResolution
tenEighty.interlaced = true
tenEighty.name = "1080i"
tenEighty.frameRate = 25.0let alsoTenEighty = tenEighty
alsoTenEighty.frameRate = 30.0print("the frame rate of the tenEighty is \(tenEighty.frameRate)")
输出结果为:
the frame rate of the tenEighty is 30.0
Program ended with exit code: 0

说明tenEightyalsoTenEighty 指向的是同一个实例,所以是引用传递。

相等操作符

因为类是引用类型,所以存在着多个常量或者变量指向同一个实例,那么如何判断它们是否指向同一变量呢?使用相等操作符 ===,这是连续三个等号组成的操作符。
如果指向同一个实例,则是===,否则为!==
注意,该符号只能用于类的实例,不能用于结构体和其他值类型。

类和结构体之间的抉择

你可以使用类和结构体来自定义类型,在代码中将其视为构建块来使用。但是结构体实例是传值,而类实例是传引用。那么如何在二者之间抉择呢?这里有一个一般性的准则。当应用到以下条件时可以考虑创建结构体:

    • 结构体的主要目的是封装一些简单的相关数据值• 当赋值或者传递时希望这些封装的值将会被拷贝而不是引用• 由结构体存储的值都值类型,它们更多是的是拷贝而不是引用• 结构体不需要从其他类型继承属性

比如以下示例:

• 几何图形的尺寸
• 三维坐标的点
.......

其他情况下都可以考虑使用类。实际情况上,这就意味着大多数的自定义类型是类,而不是结构体。

参考:
The Swift Programming Language (Swift 3)

Swift 类和结构体总结相关推荐

  1. Swift —— 类与结构体

    Swift -- 类与结构体 1. 初识类与结构体 1.1 异同点 1.2 类(引用类型) 1.3 结构体 (值类型) 1.4 类和结构体的内存位置 1.4.1 结构体的内存位置 1.4.2 类的内存 ...

  2. Swift 类与结构体

    前言 类和结构体是人们构建代码所用的一种通用且灵活的构造体.我们可以使用完全相同的语法规则来为类和结构体定义属性(常量.变量)和添加方法,从而扩展类和结构体的功能. 与其他编程语言所不同的是,Swif ...

  3. Swift 类和结构体

    Swift 中结构体和类的功能更加相近 结构体和类对比 Swift 中结构体和类有很多共同点.两者都可以: 定义属性用于存储值 定义方法用于提供功能 定义下标操作用于通过下标语法访问它们的值 定义构造 ...

  4. swift类和结构体

    2.9类和结构体 本页包含内容: 类和结构体对比 结构体和枚举是值类型 类是引用类型 类和结构体的选择 字符串.数组.和字典类型的赋值与复制行为 类和结构体是人们构建代码所用的一种通用且灵活的构造体. ...

  5. Object-C---gt;Swift之(八)类和结构体

    在Swift中类和结构体有高度的相似性.二者主要区别是: 1. 结构体不支持继承 2. 结构体不支持定义析构器 3. 结构体是值类型,而类是引用类型 定义类语法格式: [修饰符]class 类名 { ...

  6. Swift之深入解析类和结构体的本质

    一.类和结构体的异同 Swift中,类和结构体有许多相似之处,但也有不同.内存分配可以分为堆区(Heap)和栈区(Stack),由于栈区内存是连续的,内存的分配和销毁是通过入栈和出栈操作进行的,速度要 ...

  7. Swift傻傻分不清楚系列(十一)类和结构体

    本页包含内容: 类和结构体对比 结构体和枚举是值类型 类是引用类型 类和结构体的选择 字符串(String).数组(Array).和字典(Dictionary)类型的赋值与复制行为 类和结构体是人们构 ...

  8. Swift -- 7.3 类和结构体

    swift的类和结构体高度相似,无论是定义语法还是用法上,swift的类和结构体都具有高度的相似性 区别是:结构体不支持继承(自然也不支持类型转换了.....这个,还不太理解) 结构体不支持定义析构器 ...

  9. Swift基础语法: 25 - Swift的类和结构体

    在我们实际开发的过程中, 类和结构体是人们创建代码时所用的一种通用且灵活构造体, 为了在类和结构体中实现各种功能,我们必须要严格按照对于常量,变量以及函数所规定的语法规则来定义属性和添加方法. 但是在 ...

最新文章

  1. LeetCode 47全排列Ⅱ48旋转图像
  2. java子类实例初始化过程
  3. 交叉编译器的命名规则及详细解释(arm/gnu/none/linux/eabi/eabihf/gcc/g++)
  4. cf914D. Bash and a Tough Math Puzzle(线段树)
  5. python中回车怎么表示_如何在python中使用读取行仅拆分回车符?
  6. HTML5教程:1.1 迎接新的Web时代
  7. 中国特种电器灯泡行业市场供需与战略研究报告
  8. pandas 索引 —— index、set_index、reset_index
  9. 8个免费、可商用的视频素材网站,一定要收藏
  10. 标签设计软件如何设计注册商标标识
  11. 性能测试——抗攻击-hyenae-ddos攻击
  12. pageadmin CMS网站制作教程:如何修改栏目类型
  13. 数据结构与算法-平衡二叉搜索树
  14. 2021寒假笔记(数论)
  15. 服务器虚拟化数据怎么转移,从物理服务器迁移到虚拟机的两大方案
  16. Java中notify() 和 notifyAll()的区别
  17. WiFi快连、SmartConfig、SmartConnect、smartlink
  18. 半导体无尘车间测试尘埃粒子浓度等级设备
  19. JAVA - JDK 环境配置
  20. Codeforces 891E. Lust 生成函数

热门文章

  1. Android学习-使用WebView在app上显示网页
  2. Win10更新系统,VirtualBox与win10不兼容处理办法
  3. python开发app-如何用python写一个安卓APP?(上)
  4. 2020年全国大学生数学建模竞赛赛题 选题建议
  5. python经典编程题分别取个位十位百位
  6. Leetcode算法——50、实现乘方运算
  7. 基于java斗地主_码云推荐开源项目丨 用 Java 写了一个控制台玩的斗地主
  8. matlab音乐合成卡农,神马FL神马Cubase都弱爆了!【matlab】弹凑卡农
  9. 23种设计模式彩图-设计模式之禅
  10. 怎样清理苹果手机内存空间_你还不知道?苹果手机这样清理垃圾,轻松腾出10G内存!...