Swift——类与结构体

一.结构体

在swift的标准库中,大部分的类型都是结构体,比如:Int,Double,String,Array,Dictionary等等,它们都是结构体。

结构体定义如下:

struct Person {
    var name:String
    var age:Int
}

1.结构体的初始化

所有结构体都有一个编译器自动生成的初始化器,这样保证了结构体成员都有初始值。

如图:

如果你自定义了一个初始化器,那么编译器就不会生成初始化器,初始化器定义方式如下:

我们在定义结构体初始化时,一定要保证所有的结构体成员都有初始化值,否则会报错。

二.类

类与结构体十分类似,它们的不同点如下:

  1. 类可以继承,结构体不可以继承
  2. 类的实例类型可以通过使用类型转换进行检查和解释
  3. 类有析构函数(deinit()),该函数可以用来释放其分配的资源
  4. 引用计数允许对一个类实例有多个引用
  5. 编译器不会为类自动提供成员初始化器

1.类的初始化

与结构体不同,编译器不会提供初始化器,所以,如果你的类里面的成员没有初始化值,那你需要为类提供一个指定的初始化器,,否则编译不通过。

初始化如图:

也可以创建便捷初始化器,但是使用便捷初始化器,必须先调用主初始化器,如图:

在swift中,指定初始化器和便捷初始化器有以下规则:

规则1:指定初始化器必须保证在向上委托给父类初始化器之前,其所在类引入的所有属性都要初始化完成。 

规则2:指定初始化器必须先向上委托父类初始化器,然后才能为继承的属性设置新值。如果不这样做,指定初始化器赋予的新值将被父类中的初始化器所覆盖 

规则3:便捷初始化器必须先委托同类中的其它初始化器,然后再为任意属性赋新值(包括同类里定义的属性)。如果没这么做,便捷构初始化器赋予的新值将被自己类中其它指定初始化器所覆盖。 

规则4:初始化器在第一阶段初始化完成之前,不能调用任何实例方法、不能读取任何实例属性的值,也不能引用 self 作为值。

如图:

class Father {
    var name:String
    var age:Int
    init(name: String, age: Int) {
        self.name = name
        self.age = age
    }
}

class Son:Father{
    var height:Double
    var weight:Double = 20
    init(height: Double) {
        print("\(self.weight)")

        self.height = height
        super.init(name: "2", age: 20)//规则1,调用父类初始化器前,自身类成员必须初始化
        show() //规则4 所有属性初始化之后,才可以调用实例方法
        print(self)
        self.name = "222"//规则2,对继承的属性赋新值,必须先委托父类初始化器
        
    }
    func show(){
        print("Son的show方法")
    }
    convenience init() {
        self.init(height:110)
        self.weight = 120//规则3
        self.height = 170
    }

}

可失败初始化器:这种初始化器是当初始化失败时,我们允许类返回nil用来表示类初始化失败,初始化失败的原因可能是外部参数输入不合法,或不满足可初始化的条件,其定义如下:

必要初始化器:在类初始化器前添加required关键字来表示该类的所有子类都必须实现该初始化器。如图:

三.值类型与引用类型

swift里面的类型分为两种:值类型和引用类型

  • 值类型:每个实例都保留了一分独有的数据拷贝,一般以结构体(struct)、枚举(enum)或者 元组(tuple)的形式出现。
  • 引用类型:每个实例共享同一份数据来源,一般以类(class)的形式出现。

1.值类型与引用类型的区别:

值类型的变量在赋值的时候是深拷贝,当一个变量的属性值被修改,另一个变量的值不会变。

引用类型的变量不会直接存储具体的实例对象。

这里可以看见,p1和p2对应的地址是相同的,当修改一个实例对象的属性值,另一个也会被修改。

四.类和结构体的存储位置

引用类型和值类型还有一点不同就是存储位置不同,值类型存储在栈(stack)上,而引用类型存储在堆(heap)上。

五.如何使用结构体和类

因为结构体存储在栈上,而类存储在堆上,因此在创建和销毁上,类消耗的时间和内存会比较多,同时,类是引用类型,在赋值时会有引用计数,这里也会造成成本,因此,创建结构体会比创建类所消耗的时间和内存更少。

使用值类型的时机:

  • 用==运算符比较实例数据时
  • 希望实例被拷贝后仍保持独立状态时
  • 数据会被多个线程使用时

使用引用类型的时机:

  • 用==运算符比较实例身份时
  • 希望创建一个可以共享,可变对象时

五.类的生命周期

1.Swift的编译过程

iOS开发的语言都是通过LLVM进行编译,如图:

  • OC通过clang编译器,编译成IR文件,然后再生成可执行文件.o(这里也就是我们的机器码) 
  • Swift则是通过Swift编译器编译成IR文件,然后在生成可执行文件.o。

Swift编译相关命令:

//分析输出AST
swiftc main.swift -dump-parse


//分析并检查类型输出AST
swiftc main.swift -dump-ast


//生成中间体语言(SIL),未优化
swiftc main.swift -emit-silgen

//生成SIL,优化后
swiftc main.swift -emit-sil

//生成LLVM中间体语言(.ll文件)
swiftc main.swift -emit-ir


//生成LLVM中间体语言(.bc文件)
swiftc main.swift -emit-bc

//生成汇编
swiftc main.swift -emit-assembly

//编译生成可执行.out文件
swiftc -o main.o main.swift

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/924183.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

反射泛型

反射 class 包含哪些内容? 当使用new 对象时需要构造函数是public 的,而当变成私有时再new则会报错 反射通过私有构造方法创建对象,破环单例模式 Clazz.getDeclared(构造函数,方法属性等)和直接get构造函数,方法属性等…

RHCE——SELinux

SELinux 什么是SELinux呢?其实它是【Security-Enhanced Linux】的英文缩写,字母上的意思就是安全强化Linux的意思。 SELinux是由美国国家安全局(NSA)开发的,当初开发的原因是很多企业发现,系统出现问题的原因大部分都在于【内部…

etcd、kube-apiserver、kube-controller-manager和kube-scheduler有什么区别

在我们部署K8S集群的时候 初始化master节点之后(在master上面执行这条初始化命令) kubeadm init --apiserver-advertise-address10.0.1.176 --image-repository registry.aliyuncs.com/google_containers --kubernetes-version v1.16.0 --service…

uniapp定义new plus.nativeObj.View实现APP端全局弹窗

为什么要用new plus.nativeObj.View在APP端实现弹窗?因为uni.showModal在APP端太难看了。 AppPopupView弹窗函数参数定义 参数一:弹窗信息(所有属性可不填,会有默认值) 1.title:"", //标题 2.content:"", //内容 3.confirmBoxCo…

一文学习开源框架OkHttp

OkHttp 是一个开源项目。它由 Square 开发并维护,是一个现代化、功能强大的网络请求库,主要用于与 RESTful API 交互或执行网络通信操作。它是 Android 和 Java 开发中非常流行的 HTTP 客户端,具有高效、可靠、可扩展的特点。 核心特点 高效…

DRM(数字权限管理技术)防截屏录屏----视频转hls流加密、web解密播放

提示:视频转hls流加密、web解密播放 需求:研究视频截屏时,播放器变黑,所以先研究的视频转hls流加密 文章目录 [TOC](文章目录) 前言一、工具ffmpeg、openssl二、后端nodeexpress三、web播放四、文档总结 前言 ‌HLS流媒体协议‌&a…

Rk3588 onnx转rknn,出现 No module named ‘rknn‘

一、操作步骤: rk3588 需要将yolo11 的模型onnx转rknn。 https://github.com/airockchip/rknn_model_zoo/tree/main/examples/yolo11 这个是用yolo11训练的模型,有80种类型。 完整下载下来后,在按文档描述下载模型下来: 然后进…

IDEA 解决Python项目import导入报错、引用不到的问题

使用Idea 23.1 专业版编写Python项目时,import 导入爆红,无法引入其他package的代码,现象如: 解决方案:Idea表头打开 File -> Project Settring 解决效果:

unity 使用UI上的数字按钮,给text添加数字,并且显示光标,删除光标前数字,

今天有个需求,输入身份证,但是不用键盘,要点击按钮输入数字,并且可以控制光标, 1、数字按钮:点击后text添加数字内容 2、删除按钮:删除光标前的一个字符 3、左箭头:移动光标向左移动…

火山引擎VeDI在AI+BI领域的演进与实践

随着数字化时代的到来,企业对于数据分析与智能决策的需求日益增强。作为新一代企业级数据智能平台,火山引擎数智平台VeDI基于字节跳动多年的“数据驱动”实践经验,也正逐步在AI(人工智能)与BI(商业智能&…

【逐行注释】自适应观测协方差R的AUKF(自适应无迹卡尔曼滤波,MATLAB语言编写),附下载链接

文章目录 自适应R的UKF逐行注释的说明运行结果部分代码各模块解释 自适应R的UKF 自适应无迹卡尔曼滤波(Adaptive Unscented Kalman Filter,AUKF)是一种用于状态估计的滤波算法。它是基于无迹卡尔曼滤波(Unscented Kalman Filter&…

LLM应用-prompt提示:RAG query重写、相似query生成 加强检索准确率

参考: https://zhuanlan.zhihu.com/p/719510286 1、query重写 你是一名AI助手,负责在RAG(知识库)系统中通过重构用户查询来提高检索效果。根据原始查询,将其重写得更具体、详细,以便更有可能检索到相关信…

Spring Boot 与 Spring Cloud Alibaba 版本兼容对照

版本选择要点 Spring Boot 3.x 与 Spring Cloud Alibaba 2022.0.x Spring Boot 3.x 基于 Jakarta EE,javax.* 更换为 jakarta.*。 需要使用 Spring Cloud 2022.0.x 和 Spring Cloud Alibaba 2022.0.x。 Alibaba 2022.0.x 对 Spring Boot 3.x 的支持在其发行说明中…

如何通过PHP爬虫模拟表单提交,抓取隐藏数据

引言 在网络爬虫技术中,模拟表单提交是一项常见的任务,特别是对于需要动态请求才能获取的隐藏数据。在电商双十一、双十二等促销活动期间,商品信息的实时获取尤为重要,特别是针对不断变化的价格和库存动态。为了满足这种需求&…

嵌入式Qt使用ffmpeg视频开发记录

在此记录一下Qt下视频应用开发的自学历程,可供初学者参考和避雷。 了解常用音频格式yuv420p、h264等了解QML,了解QVideoOutput类的使用,实现播放yuv420p流参考ffmpeg官方例程,调用解码器实现h264解码播放 不需要手动分帧。ffmpeg…

Java设计模式笔记(一)

Java设计模式笔记(一) (23种设计模式由于篇幅较大分为两篇展示) 一、设计模式介绍 1、设计模式的目的 让程序具有更好的: 代码重用性可读性可扩展性可靠性高内聚,低耦合 2、设计模式的七大原则 单一职…

dns 服务器简单介绍

dns 服务器分类: 根域名服务器顶级域名服务器权威域名服务器本地域名服务器 dns 的查询过程 国内优秀公共域名 腾讯:DNSPod-免费智能DNS解析服务商-电信_网通_教育网,智能DNS-烟台帝思普网络科技有限公司 119.29.29.29 和 182.254.118.118 阿里&#xf…

vscode中json文件的注释飘红

vscode的json文件 添加注释,提示json中不允许有注释,点编辑器最下面的json,如下图 然后选择如上图的json with comments就好了

AI PAC!PLC与AIPC通过微定制深度融合助力工业场景下人工智能的落地!

一,前言 科技日益发展,总是会诞生出一些新应用和新场景,而这些场景一开始可能并没有对应的解决方案,这个时候就需要定制化的开发来适应新需求,而硬件的定制开发更为头疼,硬件开发设计到外观设计、结构设计、…

Python多进程/多线程通信实例

Python多进程/多线程通信实例 1. 多进程/多线程 多线程的定义 多线程(Multithreading) 是一种并发执行的编程技术,在一个进程内创建和管理多个线程,每个线程可以独立执行任务。线程是进程中的一个执行单元,多个线程共…