文档章节

Swift讲解专题十——类与结构体

珲少
 珲少
发布于 2016/05/16 11:13
字数 1078
阅读 102
收藏 2
点赞 2
评论 0

Swift讲解专题十——类与结构体

一、引言

        Swift中的类与结构体十分相似,和Objective-C不同的是,Swift中的结构体不仅可以定义属性,也可以像类一样为其定义方法。

        Swift中的类与结构体有如下相似点:

1.定义属性来存储值。

2.定义函数来提供功能。

3.通过定义下标语法使用下标的方式取值。

4.定义构造方法来对其进行初始化。

5.通过扩展来在原始基础上添加功能。

6.通过协议来定义实现标准。

当然类和结构体也有许多不同点,下面这些功能是类独有的,结构体没有:

1.通过继承来创建类的子类。

2.在运行时允许对类的实例进行类型的检查和解释。

3.析构方法可以释放被类引用的资源。

4.通过引用计数允许一个类实例的多处引用。

        当开发者在代码中传递这些实例时,结构体总是被复制,而类则是被引用。这是结构体和类的最本质区别。

二、类与结构体的定义

        类与结构体在定义语法上相似,示例代码如下:

class MyClass {
    var name = "HS"
    var age = 25
}
struct MyStruct {
    var param1:Int
    var param2:String
}
//创建类的实例
var obj1 = MyClass()
//创建结构体的实例 所有结构体会默认生成一个逐个设置属性的构造方法 而类不会
var obj2 = MyStruct(param1: 1,param2: "1")
//可以通过点语法来获取类或者结构体中的属性值
print(obj1.age,obj2.param1)

通过实例间的传递,可以证明Swift中类被引用于结构体被复制这样的特点,示例如下:

//将类实例传递给另一个变量
var obj3 = obj1
//将结构体实例传递给另一个变量
var obj4 = obj2
//修改变量的值
obj3.name = "NewHS"
obj4.param1 = 2
//将 打印 NewHS 1 //说明类是被引用的 结构体则被赋值
print(obj1.name,obj2.param1)

注意:在实例传递时同样采用复制原理的还有枚举类型。

        由于类是通过引用来进行传递,Swift中还提供了一种运算符用来比较两个实例变量或常量是否指向同一个引用,示例如下:

if obj1===obj3{
    print("same refer")
}else if obj1 !== obj3 {
    print("not same refer")
}

实际上,===与!==运算符比较的是指针内容。

三、类和结构体的选择

        由于类和结构体有着不同的传递机制,因此其也适用于不同的开发任务,下面这些情况下,官方推荐开发者使用结构体来创建数据类型:

1.该数据类型封装少量的简单数据值。

2.该类型数据来传递时,应该被复制。

3.该类型中定义的数据类型在传递时也应该被赋值。

4.不需要通过继承另一个数据类型而来。

除了上面列举的一些情况,其它情况下,都推荐开发者使用类来描述数据,这也是开发中最后常用的手段。

扩展:在Swift中,Array,String,Dictionary这些类型都是采用的结构体的方式来实现,并不是采用引用的方式,NSString,NSArray,NSDictionary这些Objective-C的类是采用引用的方式实现的,因此在Swift中,String,Array,Dictionary在传递时总是被赋值。然而官方文档中还有一句话十分有意思:

The description above refers to the “copying” of strings, arrays, and dictionaries. The behavior you see in your code will always be as if a copy took place. However, Swift only performs an actual copy behind the scenes when it is absolutely necessary to do so. Swift manages all value copying to ensure optimal performance, and you should not avoid assignment to try to preempt this optimization.

大致意思是,在你的代码中,拷贝行为看起来似乎总会发生。然而,Swift 在幕后只在绝对必要时才执行实际的拷贝。Swift 管理所有的值拷贝以确保性能最优化,所以你没必要去回避赋值来保证性能最优化。

 

专注技术,热爱生活,交流技术,也做朋友。

——珲少 QQ群:203317592

© 著作权归作者所有

共有 人打赏支持
珲少

珲少

粉丝 833
博文 372
码字总数 435295
作品 0
上海
iOS工程师
Swift专题讲解二十——扩展

Swift专题讲解二十——扩展 一、简介 Swift中的扩展与Objective-C中的类别功能相似,扩展可以为一个已有的类、结构体、枚举或者协议添加新的属性或方法,与Objective-C的类别不同的是,Swift...

珲少 ⋅ 2016/05/29 ⋅ 0

Swift讲解专题十二——方法

Swift讲解专题十二——方法 一、引言 方法只是一个术语,其实就是将函数与特定的类型结合,类、结构体、枚举都可以定义方法,方法又分为实例方法和类型方法,类型方法类似于Objective-C中的类...

珲少 ⋅ 2016/05/17 ⋅ 1

Swift讲解专题十三——下标访问

Swift讲解专题十三——下标访问 一、引言 在以前的博客中,讨论过在Objective-C中,通过下标的方式访问自定义数据模型的方法。Objective-C中主要是通过实现一系列方法来使自定义的数据类型支...

珲少 ⋅ 2016/05/17 ⋅ 1

Swift讲解专题十一——属性

Swift讲解专题十一——属性 一、引言 属性将值与类,结构体,枚举进行关联。Swift中的属性分为存储属性和计算属性两种,存储属性用于存储一个值,其只能用于类与结构体,计算属性用于计算一个...

珲少 ⋅ 2016/05/16 ⋅ 3

Swift专题讲解二十三——高级运算符

Swift专题讲解二十三——高级运算符 一、引言 除了前边博客中介绍的基本运算符外,Swift中还支持更多高级运算符,也支持开发者进行运算符的自定义。Swift中的算符运算符有一个特点,其不会产...

珲少 ⋅ 2016/05/31 ⋅ 1

Swift专题讲解十五——类型构造

Swift专题讲解十五——类型构造 一、引言 构造是类、结构体、枚举在实例化中必须执行的过程,在构造过程中,类、结构体必须完成其中存储属性的构造。Swift中的构造通过构造方法来完成,和Obj...

珲少 ⋅ 2016/05/19 ⋅ 0

Swift专题讲解十六——ARC在Swift中的应用

Swift专题讲解十六——ARC在Swift中的应用 一、引言 ARC(自动引用计数)是Objective-C和Swift中用于解决内存管理问题的方案。在学习Objective-C编程时经常会学习到一个关于ARC的例子:在一个...

珲少 ⋅ 2016/05/20 ⋅ 1

Swift讲解专题八——闭包

Swift讲解专题八——闭包 一、引言 Swift中的闭包是有一定功能的代码块,这十分类似于Objective-C中的block语法。Swift中的闭包语法风格十分简洁,其作用和函数的作用相似。 二、从一个系统函...

珲少 ⋅ 2016/05/14 ⋅ 3

Swift专题讲解十四——继承

Swift专题讲解十四——继承 一、引言 Swift中,一个类可以从另一个类继承方法、属性、下标及其他特性。当一个类继承于另一个类时,这个类被称为子类,所继承的类被称为父类。在Swift中,继承...

珲少 ⋅ 2016/05/18 ⋅ 1

Swift专题讲解十九——类型转换

Swift专题讲解十九——类型转换 一、类型检查与转换 在Objective-C和Java中,任何类型实例都可以通过强转使编译器认为它是另一种类型的实例,这么做其实是将所有的安全检查工作都交给了开发者...

珲少 ⋅ 2016/05/27 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

HiSDP —— 高效的C++软件开发平台

目前阿里集团每天有近1000PB的数据是通过LogAgent采集的,为了让LogAgent做到资源占用节省和高效采集,背后是基于HiSDP去构建的。 缘由 当决定采用C++编程语言去开发一个软件时,紧接着所面临...

阿里云云栖社区 ⋅ 24分钟前 ⋅ 0

zookeeper-3.4.12 下载与安装教程

一、zookeeper下载地址 http://mirrors.hust.edu.cn/apache/zookeeper/ 二、启动教程 把压缩包放在指定目录下 第三: 进入 conf文件夹底下 zoo_sample.cfg 文件名改成 zoo.cfg 第四步: 进入b...

泉天下 ⋅ 26分钟前 ⋅ 0

Oracle 中文日期转换

SELECT TO_date('2011年11月11日', 'yy"年"mm"月"dd"日"') FROM DUAL; 1. Oracle无法识别中文格式,所以添加双引号。 2. 后面的格式是指字符串在转换前的格式,而不是指转换后的格式。...

江戸川 ⋅ 27分钟前 ⋅ 0

MySell:API Spring Boot

起步 类目 商品 订单

BeanHo ⋅ 30分钟前 ⋅ 0

Spring方法拦截器MethodInterceptor

参考资料 1、Spring方法拦截器MethodInterceptor 2、Sharding JDBC源码分析-JdbcMethodInvocation类的作用

哎小艾 ⋅ 33分钟前 ⋅ 0

正则表达式

元字符 元字符,又叫字符集,就是用一些特殊符号表示特定种类的字符或位置。 匹配字符 . 匹配除换行符以外的任意字符 \w 匹配字母或数字或下划线或汉字 \s 匹配任意的空白符 \d 匹配数字 匹配...

wangchen1999 ⋅ 33分钟前 ⋅ 0

数据库数据导入Elasticsearch案例分享

基于bboss持久层和bboss elasticsearch客户端实现数据库数据导入es案例分享(支持各种数据库和各种es版本) 1.案例对应的源码 https://gitee.com/bboss/bboss-elastic/blob/master/bboss-el...

bboss ⋅ 34分钟前 ⋅ 0

动手---sbt(2)

参考 https://blog.csdn.net/leishangwen/article/details/46225587 建立一个chisel_max目录,文件内容如后面所述,现在开始执行命令: joe@joe-Aspire-Z3730:/media/sdb4/download/scala$ c......

whoisliang ⋅ 40分钟前 ⋅ 0

纯js实现最简单的文件上传(后台使用MultipartFile)

<!DOCTYPE html><html><head> <meta charset="UTF-8"> <title>XMLHttpRequest上传文件</title> <script type="text/javascript"> //图片上传 var xhr......

孟飞阳 ⋅ 45分钟前 ⋅ 0

iOS宇宙大战游戏、调试工具、各种动画、AR相册、相机图片编辑等源码

iOS精选源码 日期时间选择器,swift Space Battle 宇宙大战 SpriteKit游戏源码 LLDebugTool - 便捷的IOS调试工具(新增截屏功能) 相机扫描or长按识别二维码、FMDB、键盘动态高度、定位等 动画...

sunnyaigd ⋅ 46分钟前 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部