swift类构造过程解读

SWIFT报文格式规范中format格式的含义讲解 阅读详情
在swift中,类的继承和构造过程是需要注意的,主要是其构造过程需要进行严格的安全检查,必须符合其检查的代码方能编译,具体内容如下:
swift的构造过程是两段式的,什么是两段式呢,就是类实例的初始化,即构造器的调用和执行过程,分为两个阶段。
先来看两个阶段是怎么个分法,弄清楚两个阶段分别做了什么,就自然明白为什么要分两个阶段以及这么做的好处了。

首先来看两个图,图片来自《The Swift Programming Language》:


这是swift的继承链,Convenience表示遍历构造器,Designated表示指定构造器,右图可以看出:
1.便利构造器必须调用同类的指定构造器已完成属性的初始化。
2.指定构造器必须调用父类的指定构造器以完成父类属性的初始化。
这个构造链只是表示了继承关系,并没有详细给出构造过程,以下两张图片详细表示了构造过程的两个阶段:
第一阶段: 

第二阶段:


从图中可以看到,第一阶段是自下而上的,而第二阶段是自上而下的,怎么理解呢?
我们知道,在子类进行实例化的过程中,必不可少的一个步骤是:调用父类的构造方法已完成父类属性的初始化。而一个对象的存储属性就可以由此分为两类,一类是自身引入的,一类是继承自父类的。
明确这一点后,再看一个原则:一个对象的内存只有在其所有的存储属性全部确定之后才能完全初始化。
也就是说,我们在指定构造器中对类的存储属性初始化,必须完成自身引入的存储属性和继承自父类的存储属性这两类属性的初始化后,实例才完全初始化,如果在构造器中只初始化自身引入的存储属性,或者只初始化继承自父类的存储属性,该实例都无法完成初始化。
所以,我们初始化一个实例通常不仅要为自身引入的属性赋初值,还要调用父类的构造方法来处理父类的属性,这样每个类都对自身引入的属性初始化后,调用父类的构造方法,一层一层调用上去,最终到达了继承链顶端,实例才真正完成初始化。
在swift中,上述过程严格执行安全检查,以确保构造过程顺利完成,其第一阶段的任务就是,完成实例的完全初始化,而第二阶段的任务则是,可以由我们对已经完全初始化好的实例进行进一步的定制。
简单来说就是:
第一阶段自下而上,为所有属性赋初值,最终到达继承链顶端,所有属性都初始化完成,实例完全初始化。
第二阶段自上而下,从继承链顶端开始向下,给了我们在每一层对实例进行再定制的权利,我们可以在这个过程中在任意一层对实例进行修改。
反映在代码上: 


可以看到,对子类的初始化严格按照swift的要求去做,先初始化自身引入的属性,再调用父类的构造器初始化父类的属性,最后对实例进行随意定制。

需要明确的是,这么做并不是因为这样的流程更加清晰,而是swift严格要求必须按照这样的顺序,下面就是swift为了保证两段式构造过程顺利完成而进行的四个安全检查: 



从第四条可以看出,只有在第一阶段完成之后,实例才真正初始化完成。
两个阶段的详细过程解读如下: 




SnapKit源码解读 SnapKit源码解读 什么是Snapkit SnapKit是一个使用 Swift 编写而来的 AutoLayout 框架,通过使用Snapkit,我们可以 通过简短的代码完成布局,使用 view.snp.makeConstraints { (make) in make.center.equalToSuperview() } DSL(Domain specific Language)特定领域语言 DSL是为了解决某些特定场景下的任务而专门设计的语言。 如果能把一些设计师产出的长宽、色值、文字、居中、距 上等 阅读详情

相关推荐

Swift语言的语法糖

语法糖是由计算机科学家Peter G. Neumark首次提出的术语,意指“糖衣”或者“让人愉悦的语法”。语法糖并不改变语言的功能,却提供了更加简洁、易懂的语法形式,使得开发者能够更加直观地表达自己的想法。例如,在Swift中,我们可以用更简洁的方式来定义闭包、循环、以及条件语句,这些都是语法糖在设计中的体现。Swift语言中的语法糖极大地提高了开发者的编程体验,简化了代码的书写和理解。通过可选链、字面量初始化、类型推断等特性,Swift不仅让代码更简洁,同时也为开发者的日常工作降低了负担。

2501_90168256的博客 479

swift的两段式构造过程

swift中构造过程分为两步: 1.指定初始值 2.给每个类一次机会,进一步定制自己的存储属性。 两段式构造过程可以防止属性在初始化之前被访问。 注释 swift与oc的很大不同之处在于:oc给每个属性默认赋值为nil或者0,swift可以自如处理这些异常情况 swift执行的安全检查 1.在本类的所有存储属性初始化之前,不可以对父类进行初始化。 2.在父类初始完之前,不能给父类的属

frankisbaby的博客 576

Swift之深入分析字典的下标访问方法的源码调试和汇编实现

一、字典的内存布局 Swift 中字典具有以下特点: 字典由两种范型类型组成,分别是 Key(必须实现 Hashable 协议)和 Value; 提供一组 Key 和 Value,可以向字典中插入一条新的数据; 如果 Key 已经被插入字典,则可以通过 Key 获取到 Value; 可以通过 Key 删除一条字典中的数据; 每个 Key 对应,且唯一对应字典中的一个 Value。 有很多种方式可以用于存储这些 Key-Value 对,Swift 中字典采用了使用线性

╰つ栺尖篴夢ゞ 1万+

Swift中类的两段式构造(类的构造过程)

import Foundation /* 类的构造需要两个阶段: 第一阶段: 1.程序调用子类的某个构造器 2.为实例分配内存, 此时实例的内存还没有被初始化 3.指定构造器确保子类定义的所有实例存储属性都已被赋初值 4.指定构造器将调用父类的构造器, 完成父类定义的实例存储属性的初始化 5.沿着调用父类构造器的构造器链一直往上执行, 直到到达构造器链的最顶部 ...

bailang3277的博客 202

Matlab实战:3种雷达间歇采样干扰的仿真与识别(附完整代码)

本文通过Matlab实战,详细仿真了雷达有源间歇采样干扰的三种核心样式:直接转发、重复转发和循环转发干扰。文章提供了完整的代码实现,并深入探讨了基于时频分析和循环平稳分析的特征提取与识别方法,为雷达抗干扰技术的学习与实践提供了清晰的工程实现路径。

weixin_29053695的博客 364

闲人闲谈PS之一项目库存跨公司业务STO解决方案--SAP闲人的开篇

写这篇文章之前,简单说一下发这篇文章的动机。也算是在SAP这一行干了快10多年,在对一个模块了解越来越深入,越发觉自己的SAP知识浅薄。总的来说,和多数顾问一样,对于**标准功能**的应用业务场景理解还是存在或多或少的知识盲区。 因为一个偶然,看到SAP团子君的文章,分享了很多干货文章。这也是自己一直想做的时候,不管水平高低与否,分享本身就意味着提升。好了废话不多说,先在优快云上发一篇吧,困惑自己将近10年的问题的解决方案。 业务场景:在项目型企业中,通常会有这样的业务,母公司和客...

SAP闲人的博客 9267

Swift - 初始化方法顺序

与Objective-C不同,Swift的初始化方法需要保证类型的所有属性都被初始化,所以初始化方法的调用顺序就很有讲究。在某个类的子类中,初始化方法里语句的顺序并不是随意的,我们需要保证在当前子类实例的成员初始化完成后才能调用父类的初始化方法: class Cat { var name: String init() { name = "cat" } } class Tiger: Cat { let power: Int override init(

HumorousGhost 653

用户视角下的vfsglobal预约困境:从注册到登录的全流程避坑指南

本文详细解析了vfsglobal签证预约系统从注册到登录的全流程操作,帮助用户避开常见技术陷阱。针对IP限制、DNS解析、浏览器缓存等登录障碍提供实用解决方案,并揭示账号管理的隐藏规则与支付环节的延时处理技巧,助力用户高效完成签证预约。

ol78901234的博客 871

Swift之构造器(下)

本篇主要介绍Swift中构造器的一些特殊用法

梧雨北辰的博客 650

cst-python联合仿真的问题解决

cst与python联合仿真出现无法调用CST的问题解决

ayihu_的博客 2370

prplOS组件流程梳理

本文梳理了prplOS系统中设备信息管理模块(deviceinfo-manager)的工作流程。该模块启动时通过/etc/init.d/deviceinfo-manager调用核心框架amxrt执行,主要功能包括收集设备信息、管理数据模型、初始化子系统等。系统采用ODL文件定义数据模型,通过解析器将配置文件转换为内存中的对象树。流程涉及命令行参数解析、ODL文件加载、后端模块扫描等核心步骤,最终构建出完整的数据模型供上层应用访问。整个架构体现了模块化设计思想,通过动态加载插件实现功能扩展。

四儿家的小祖宗的博客 1263

8.3 Swift结构体构造器

/**          结构体构造器          */                  /**          对于构造函数很多人都会有这样一个误区,认为构造函数是用来构造一个实例的或者构造          一个对象的。这种说法我认为是不对的哈。          当我们构造一个实例,实例需要分配一个内存。而分配内存这个过程不称之为构造,这个

Rancher的博客 520

YOLO26改进 - C2PSA | C2PSA融合CPIASA跨范式交互与对齐自注意力机制 : 交互对齐机制,提升小目标与遮挡目标判别力 | ACM MM2025

本文介绍了跨范式表征与对齐Transformer(CPRAformer)及其核心的跨范式交互与对齐自注意力机制(CPIA - SA),并阐述了其在YOLO26中的结合应用。传统图像去雨模型特征提取局限大,CPIA - SA通过协同“空间 - 通道”与“全局 - 局部”范式解决该问题,由SPC - SA、SPR - SA和AAFM子模块构成,经双路提取、动态过滤、空间细化、对齐融合四步工作。我们将相关代码引入指定目录,在`ultralytics/nn/tasks.py`中注册,配置`yolo26 - C2PS

魔改工程师的博客 664

Swift(十四、构造过程(1))

Swift学习笔记(第一版),对Swift的基础知识点进行梳理总结 构造过程-两段式构造过程

弄潮者的博客 996

基于电能质量治理的场景实例:统一电能质量调节器(UPQC)与并网逆变器集成

本文通过Simulink平台,详细演示了统一电能质量调节器(UPQC)与并网逆变器的集成系统建模与仿真过程。主要内容包括:1)系统架构设计,包含光伏并网系统、非线性负载和电压扰动源;2)UPQC主电路设计,包括串联/并联单元拓扑和控制策略实现;3)与并网逆变器的能量交互与协同控制逻辑;4)典型电能质量问题的仿真测试场景。结果表明,该集成系统能有效治理电压暂降(维持负载电压380V±2%)和电流谐波(电网THD<3%),直流母线电压稳定在800V±5V。该系统为应对复杂电能质量问题提供了"电压

xiaoheshang_123的博客 309

还在用 RaiDrive/Rclone 挂载网盘?教您使用Windows 原生 WebDAV 丝滑直连 AList/Openlist,让你的网盘秒变本地硬盘!

网盘文件分散管理?😩 别再依赖第三方工具了!本文教你如何在 Windows 下,利用原生 WebDAV 功能,将 Openlist 网盘直接映射为本地硬盘!💻 操作简单,告别繁琐,让你的云端文件像本地文件一样丝滑!🚀 轻松实现高效管理,快来体验吧!

XiaoqiangClub的博客 2972

Swift

在swift中,类的继承和构造过程是需要注意的,主要是其构造过程需要进行严格的安全检查,必须符合其检查的代码方能编译,具体内容如下: swift的构造过程是两段式的,什么是两段式呢,就是类实例的初始化,即构造器的调用和执行过程,分为两个阶段。 先来看两个阶段是怎么个分法,弄清楚两个阶段分别做了什么,就自然明白为什么要分两个阶段以及这么做的好处了。 首先来看两个图,图片来自《The

Long177的博客 422

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

ms-swift支持地质勘探图像智能解读

通过ms-swift框架,实现地质勘探图像的多模态理解与智能报告生成。该方案结合视觉编码、低资源微调、分布式训练与偏好对齐技术,支持在边缘设备高效部署,显著提升判读效率与专业性,推动AI在重工业场景中的工程化落地。

weixin_42575109的博客 597

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

Swift之属性的使用和实例展示

一、Swift 属性 Swift 属性将值跟特定的类、结构或枚举关联。属性可分为存储属性和计算属性: 存储属性 计算属性 存储常量或变量作为实例的一部分 计算(而不是存储)一个值 用于类和结构体 用于类、结构体和枚举 存储属性和计算属性通常用于特定类型的实例,属性也可以直接用于类型本身,这种属性称为类型属性。 另外,还可以定义属性观察器来监控属性值的变化,以此来触发一个自定义的操作。属性观察器可以添加到自己写的存储属性上,也可以添加到从父类继承的属性上。 二、存储属性 简单

╰つ栺尖篴夢ゞ 3万+

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

Swift 掠影(A Swift Tour)

翻译 A Swift Tour

clownote 217

语音+视频+图像统一训练?ms-swift多模态能力深度解读

ms-swift实现图像、语音、视频与文本的端到端统一建模,通过共享隐空间和LoRA量化技术,支持高效微调与跨模态融合,让7B模型可在12GB显卡运行,并提供从数据处理到部署的全流程支持。

weixin_42518874的博客 1061

swift源代码解读(二) 服务的启动

接着上一次的代码解读,我们已经获得了各项命令,start  stop...除此之外还有,根据main获得的各项服务的类的对象(假设输入的是swift-init  main start) try: #加入用户输入的是swift-init start,那么command则是start 而__dict__则是对象的所有属性 status = manager.run_comm

dasgk的专栏 1052

Swift之属性的使用和实例展示 | 优快云创作打卡

一、Swift 属性 Swift 属性将值跟特定的类、结构或枚举关联。属性可分为存储属性和计算属性: 存储属性 计算属性 存储常量或变量作为实例的一部分 计算(而不是存储)一个值 用于类和结构体 用于类、结构体和枚举 存储属性和计算属性通常用于特定类型的实例,属性也可以直接用于类型本身,这种属性称为类型属性。 另外,还可以定义属性观察器来监控属性值的变化,以此来触发一个自定义的操作。属性观察器可以添加到自己写的存储属性上,也可以添加到从父类继承的属性上。 二、存储属性 简单

weixin_41165271的博客 332

SWIFT报文标准实用手册标准版下载仓库介绍:金融通信领域的专业指南

SWIFT报文标准实用手册标准版下载仓库介绍:金融通信领域的专业指南 去发现同类优质开源项目:https://gitcode.com/ SWIFT报文标准实用手册(标准版)下载仓库是金融通信领域专业人士的宝库,涵盖了SWIFT报文标准的全面解读与应用实例。 项目介绍 《SWIFT报文标准实用手册(标准版)》下载仓库为您提供了一份完整、权威的SWIFT报文标准资源。手册详尽介绍了SWIFT的基本概念...

gitblog_06750的博客 889

17.Swift学习之类

类介绍 Swift虽然推荐面向协议编程,但其也是一门面向对象开发的语言 面向对象的基础是类,类产生了对象(类的实例) Swift中用class关键字定义类 定义语法 class 类名 { // 定义属性和方法 } 举例 class Person { var name = "Zhan...

weixin_33738555的博客 108

为什么Reflection被标记DEPRECATED?Swift运行时反射的5大陷阱清单与Mirror迁移指南

Reflection 是一个曾经广受欢迎的 Swift 运行时反射开源库,能动态读取、修改对象属性甚至根据字典在运行时构造实例。但它的 README 第一行就标注了 **[DEPRECATED](已弃用)**,不再维护。本文带你快速看懂:它为什么被弃用、使用这类 Swift 运行时反射库会踩哪些坑,以及如何用标准库 Mirror 安全地完成迁移。 ## Reflection 是什么? Refl

gitblog_01032的博客 190
上一篇: swift自学注意点
Make___
博客等级 码龄12年 2粉丝 10原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值