1-Swift中的Struct 和 Class
1 为什么swift 推荐使用struct类型
在swift中是推荐使用struct类型的,值类型的变量在赋值的时候会自动进行一次低消耗的值拷贝
对比与对象的拷贝更加高效且不存在线程安全问题。
2 Struct 的概述
Swift语言中非常重视结构体,把结构体作为实现面向对象的重要手段。
Swift的Foundation 框架中,String,Array,Dictionary都是基于Struct实现的。
3 Struct 和 Class的区别
类和结构体都非常的类似,都具有定义和使用属性,方法,下标,构造器邓面向对象的特性,但是结构体不具有继承性,也不具备运行时强制类型转换等功能。
Class 是引用类型 (Reference Type)
Struct 是值类型 (Value Type)
简单的赋值方式:
a=b;
对于引用类型来讲的话,将a和b的指针指向同一块内存区域,此时改变a的值也会改变b的值
对于值类型来讲的话,是开辟新的内存给a,a和b是没有关系的两个变量,改变b不会改变a
class 为类型引用 struct为值引用
class Person{var name:String?;init(name:String?) {self.name = name;}
}// 创建一个学生
var studentA = Person.init(name: "tom");
var studentB = studentA;studentB.name = "Alex";
// 都打印Alex
print(studentA.name as Any);
print(studentB.name as Any);struct Dog{var name:String?;init(name:String?) {self.name = name;}
}var d1 = Dog.init(name: "tom");
var d2 = d1;
d2.name = "Jerry";
// 则d1 和 d2 的打印值不同
print(d1.name as Any);
print(d2.name as Any);
Struct 没有继承功能 Class 有继承功能
Swift 本质上来讲是面向协议的语言,Struct没有也不需要继承的功能,为了实现某个功能,只需要遵守一个并实现一个协议即可,从一个较高的层次来讲struct+protocol
是构成swift面向协议语言的两个基石。
Struct 的特点
1 安全性 值类型传递,自动线程安全
2 内存,没有引用计数,不会因为循环引用从而导致内存泄漏
3 速度 值类型通常是以栈的形式分配的,而不是用堆,比class 要为快
4 方法中修改属性,需要添加mutating,而class 不需要
5 序列化,不支持序列化,可以用字节转为NSData,而class支持序列化
1-Swift中的Struct 和 Class相关推荐
- 关于Swift中Struct,Class和Enum的哪些事儿
前言 Swift type System Swift是强类型的,尽管只有六种类型. 命名类型: protocol, class , struct , enum 复合类型:tuple, function ...
- 在Swift中如何使用C中的Struct
swift 无法直接访问 c 语言的Struct.只能通过指针的方式访问. ///-----例子1开始------- The c Lib API : mycapi.h <code style=& ...
- Swift 中枚举、结构体、类(enum、struct、class)
Swift 中枚举.结构体.类(enum.struct.class) Swift中的枚举与OC相比不会自动分配初始值,值的类型不会限定为整数,可以给定关联值类型和具体值(整型.浮点型.字符型(Swif ...
- Swift中Class和Struct异同
Swift 中类和结构体有很多共同点.共同处在于: 定义属性用于存储值 定义方法用于提供功能 定义下标操作使得可以通过下标语法来访问实例所包含的值 定义构造器用于生成初始化值 通过扩展以增加默认实现的 ...
- Swift中编写单例的正确方式
本文由CocoaChina译者leon(社区ID)翻译自krakendev 原文:THE RIGHT WAY TO WRITE A SINGLETON 转载请保持所有内容和链接的完整性. 在之前的帖子 ...
- Swift中依赖注入的解耦策略
原文地址:Dependency Injection Strategies in Swift 简书地址:Swift中依赖注入的解耦策略 今天我们将深入研究Swift中的依赖注入,这是软件开发中最重要的技 ...
- 在 Swift 中使用闭包实现懒加载
本文讲的是在 Swift 中使用闭包实现懒加载, 原文地址:Swift Lazy Initialization with Closures 原文作者:Bob Lee 译文出自:掘金翻译计划 译者:ls ...
- Swift中的选项集合
Swift3中的选项集合(Option Set) 作者:Ole Begemann,原文链接,原文日期:2016/09/28 译者:Lanford3_3:校对:saitjr:定稿:CMB 选项集合在OC ...
- Swift中的全局常量文件
本文翻译自:Global constants file in Swift In my Objective-C projects I often use a global constants file ...
最新文章
- 《LeetCode力扣练习》第3题 C语言版 (做出来就行,别问我效率。。。。)
- mysql delete in 结果集_MySQL从删库到跑路(2)SQL语句示例
- JZOJ 1321. 灯
- 如何写好一篇高质量的IEEE/ACM Transaction级别的计算机科学论文?——顶刊与顶会的区别...
- 处理程序“ExtensionlessUrlHandler-Integrated-4.0”在其模块列表中有一个错误模块“ManagedPipelineHandler”...
- doxygen问题集锦
- 矩阵快速幂的最简单用法
- 电脑录屏工具_这四款录屏工具,也许是电脑录屏软件中免费、无广告且最实用的,程序员必备...
- Excel 中批量处理数据(改成 json 格式)
- 深圳大学计算机与软件学院李志,李志彬
- CISSP 考证进度篇(持续监督中)
- 【C语言】C语言实现strcmp库函数
- Freeswitch 怎么配置 Proxy Media 和 bypass 模式
- ##稻盛和夫的名言##
- Ceph Async RDMA网络通信性能优化
- 特征点匹配——SIFT算法详解
- ArcGIS打开影像图显示全黑色解决办法
- javaweb羽毛球教练场地预约管理系统ssm
- CTO问我,为什么需要API网关?
- 动手组装一台 macbook pro 15寸(a1398模具,rmbp mjlq2/mjlt2)
热门文章
- [转]mysql 数据类型
- 【Android动画】之Tween动画 (渐变、缩放、位移、旋转)
- [sinatra] Just Do It: Learn Sinatra, Part One Darren Jones
- activity 的属性android:taskAffinity和android:allowTaskReparenting
- python基础学习-5(包与模块)
- python-opencv 定位识别读表
- OpenCV4Android开发实录(2): 使用OpenCV3.4.1库实现人脸检测
- php fsockopen解决办法
- 提供前进、后退功能及其他JAVASCRIPT速成秘诀
- 二维码Data Matrix编码、解码使用举例