IOS中之struct(结构体)

  • 前言
  • struct的基本语法
  • struct 和class的区别
  • class和struct比较,优缺点?
  • struct的优势
  • 使用Struct和Protocol来实现model的继承和共享

前言

  • 引用类型: 赋值时,系统不会对其对象拷贝,而是把指向该对象的指针(对象的地址值)赋值给另外一个对象,当修改某个对象的值,会随之影响另外一个对象的值

  • 值类型: 赋值时,系统会对此对象进行拷贝,赋值出一份副本给另外一个对象,当修改一个对象的值时不影响另外一个对象

在Swift中struct是属于值类型,相对于其他语言来说,Swift的结构体功能更加强大,它除了支持在结构体声明中基础变量之外,它还支持在结构体中声明方法,这相对于其他语言来说,是swift的一个特性之一。

swift在本质上来说是面向协议(Protocol Oriented)的语言,struct没有也不需要继承的功能,为了实现某个功能,struct去服从并实现某个协议就即可,从一个较高的层次来看,struct+protocol是构成swift面向协议语言的两个基石

  • 为什么需要使用结构体

    • struct可保证代码更加安全可靠,以及struct+protocol更加切合swift面向协议编程的初衷。
    • struct 更快,简单,安全,适合数据处理操作使用,在iOS开发中适合http请求的数据操作中使用。对于数据的处理解析和其他操作更快,更省内存。

struct的基本语法

  • 结构中声明变量,可以不用初始化值,但是calss中需要初始化值的
  • Struct 会自动生成一个初始化成员变量的构造器方法,创建结构体的时候调用构造器方法赋值,但是class需要自己生成
struct StructTest {var name: Stringvar age: Intvar color: UIColor}let test = StructTest(name: "guoweiyong", age: 23, color: UIColor.red)
  • 如果你重写了init()方法,系统不会帮你生成初始化构造器方法了。
init(name: String, age: Int) {self.name = nameself.age = ageself.color = UIColor.red}
let test2 = StructTest(name: "GY", age: 22)**加粗样式**
  • struct中声明方法,如果方法内部修改了 struct中声明property(属性)值,方法前面必须加上 mutating关键字,如果没有涉及到修改属性值的话,就不需要mutating修饰,正常声明实现方法即可
//日过定义的方法中需要修改属性值 必须要加上关键字mutating修饰方法mutating func funcTest(_ tempName: String) -> Void {self.name = tempName}func funcTest2() -> String {return name;}

struct调用方法和类一样,对象.方法名()

  • 如果struct中声明属性时,有一些属性有初始化值,有一些没有,那么系统会自动生成两种成员变量构造器方法,一种是包括所有的成员变量,一种是只含有没有初始化值的成员变量构造器方法
struct StructTest {var name: Stringvar age: Int = 23var color: UIColor
}//这两种初始化方法都是正确的
let test3 = StructTest(name: <#T##String#>, age: <#T##Int#>, color: <#T##UIColor#>)let test4 = StructTest(name: <#T##String#>, color: <#T##UIColor#>)

struct对于let声明的实例不能对变量进行赋值,class预设值是可以赋值let实例的。注意Swift中常用的String、Array、 Dictionary都是struct。

struct 和class的区别

主要区别:

  • struct是值引用,而class是类型引用(各有好处值类型不用担心内存问题,但无法跨view完成同一个对象调用,只能是copy一份新对象使用。class 的内存问题是需要程序要注意的,但是指针引用的强大毋庸置疑的。值类型是在栈空间上操作的,引用类型是在堆控件操作的)

  • struct没有继承的功能,class有继承功能(struct不能像class 一样继承完成重用和多态。但是struct 可以通过组合和接口实现完成重用和多态。从这一点来说struct是比class有优势的)

  • 定义结构体struct类型时其成员变量可以没有初始值(编译器会自动生成一个成员构造器,给变量赋一个默认值),如果使用这种格式定义一个类,编译器会报错,他会提醒你这个类没有被初始化

struct SRectangle {var width = 200var height: Int
}class CRectangle {var width = 200var height: Int // 报错
}

class和struct比较,优缺点?

class有一下功能,struct是没有的:

  • 1.class可以继承,子类可以使用父类的特性和方法。但是struct是不能被继承的
  • 2.类型转换可以在运行时检查和解释一个实例对象
  • 3.class可用 deinit来释放资源
  • 4.一个类可以被多次引用

struct的优势

  • 结构较小,适用于赋值操作,相比较一个class, 实例被多次引用(容易发生内存泄漏),struct更安全
  • 无需担心内存泄漏问题(struct的操作都是在栈控件上,class在堆控件上)

使用Struct和Protocol来实现model的继承和共享

  • 在项目中如何选择StructClass

    • 默认使用Struct
    • 当你需要继承Objective-C某些类的的时候使用class
    • 当你需要控制唯一性时使用class
    • 我们使用struct和protocol来实现model继承和共享行为
protocol AnimalCommonProtocol {var name: String? {get set} //表示属性是可读写的,{ get }用来表示属性为可读的var weight: Double {get set}func run()
}struct Cat: AnimalCommonProtocol {func run() {print("cat run")}var name: String?var weight: Double/// 自增属性var gender: String?
}struct Dog : AnimalCommonProtocol {var name: String?var weight: Double/// 自增属性var type: String?func run() {print("Dog run")}
}

IOS中结构体(struct)相关推荐

  1. java解析c的结构体_解析C语言中结构体struct的对齐问题

    首先看一下结构体对齐的三个概念值: 数据类型的默认对齐值(自身对齐): 1.基本数据类型:为指定平台上基本类型的长度.如在32位机器中,char对齐值为1,short为2,int,float为4,do ...

  2. Linux+c语言结构体对齐,C语言中结构体struct的对齐问题解析

    一:struct和union的区别 struct,相互关联的元素的集合,每个元素都有自己的内存空间:每个元素在内存中的存放是有先后顺序的,就是定义时候的顺序:一个struct所占的总的内存大小,并不是 ...

  3. C语言中结构体struct的用法总结

    不积硅步,无以至千里.不积小流,无以成江海.每天进步一点点. 一.概述 结构体属于C语言提供给用户的可以进行自定义的数据类型,来满足一些个性化需求.它允许用户建立由不同类型数据组成的组合型的数据结构. ...

  4. C语言中结构体struct的用法

    点击蓝字 关注我们 定义结构体变量 下面举一个例子来说明怎样定义结构体变量. struct string { char name[8]; int age; char sex[2]; char depa ...

  5. Matlab中结构体struct创建和使用

    在项目上遇见了调用api接口,接口返回的信息为struct,故探讨一下matlab的struct结构体 1.struct结构体创建 创建结构体数组有两种方式,分别为直接创建和使用struct函数 1. ...

  6. Matlab中结构体Struct使用

    ​​​​​​1.结构体数组创建 创建结构体数组有两种方式,分别为直接创建和使用struct函数 1.1 直接创建 直接定义字段,像使用一般matlab变量一样,不需要事先声明,支持动态扩充.下面创建一 ...

  7. C语言结构体自动初始化实现,C语言中结构体(struct)的几种初始化方法

    本文给大家总结的struct数据有3种初始化方法 1.顺序 2.C风格的乱序 3.C++风格的乱序 下面通过示例代码详细介绍这三种初始化方法. 1)顺序 这种方法很常见,在一般的介绍C的书中都有介绍. ...

  8. C语言结构体struct详解与实例

    目录 1.定义 2.应用 2.1初始化 2.2使用 3.结构体对齐规则与存储 1.定义 C语言中结构体(struct关键字定义)是一种自定义数据类型.通过结构体的定义可以将多种不同类型数据形成一个组合 ...

  9. 内核中用于数据接收的结构体struct msghdr

    我们从一个实际的数据包发送的例子入手,来看看其发送的具体流程,以及过程中涉及到的相关数据结构.在我们的虚拟机上发送icmp回显请求包,ping另一台主机172.16.48.1.我们使用系统调用send ...

最新文章

  1. 【原创】Chrome最新版(53-55)再次爆出BUG!
  2. mongodb拆库分表脚本
  3. Jquery调用webService的四种方法
  4. 交叉熵代价函数cross-entropy
  5. centos6 dns转发_CentOS6 配置DNS服务器
  6. 查看操作系统版本linux_LINUX操作系统常用操作收录(二):查看文件内容命令小结...
  7. Jenkins 入门系列--jenkins 介绍
  8. 机器学习的挑战:黑盒模型正面临这3个问题
  9. IJCAI 2019 | 为推荐系统生成高质量的文本解释:基于互注意力机制的多任务学习模型...
  10. html缓存失败是什么,HTML5离线“应用程序缓存错误事件:清单读取失败(-1)”...
  11. DOS窗口的一些简单介绍
  12. 奥图码投影连接服务器没信号,奥图码投影机常见故障维修步骤
  13. 【Python爬虫实战】 图片爬虫-淘宝图片爬虫--千图网图片爬虫
  14. 疫情之下,我们该如何选择工作?
  15. RabbitMQ核心概念及基础API应用
  16. 【U8】会计科目使用自定义项著辅助核算步骤及注意事项
  17. 非线性回归-转化为线性回归以及非线性模型-用R语言实现
  18. 吵架公约,我不在担心婚后。
  19. asdasdasdaa
  20. 法兰盘零件机械加工工艺规程编制及加工右大斜面用铣床专用夹具设计

热门文章

  1. SegeX MemDialog:封装好的内存对话框(非资源对话框)说明
  2. ubuntu下安装nccl具体教程
  3. 【tkinter】用不到50行Python代码,写一个扫雷小游戏
  4. 小白也能通俗易懂的联邦学习!
  5. 导入d2lzh_pytorch包会出现的问题以及解决方案
  6. php 自定义生成短链工具
  7. 汇编语言笔记-keil5软件仿真及调试
  8. Cent OS 使用nohup 启动 Springboot避坑
  9. unity3d学习笔记-报错
  10. Allegro创建区域规则