[Swift]构造和析构

立创开源:基于STM32F103与ADS1256的六维力传感器低成本实现方案 本文详细介绍了一种基于STM32F103微控制器与ADS1256高精度ADC的低成本六维力传感器实现方案。该方案通过3D打印的六梁弹性体结构结合应变片,将多维力信号转换为电信号,并由24位ADC进行高精度采集。文章涵盖了硬件选型、电路设计、嵌入式软件驱动及上位机数据可视化全流程,为机器人、精密测量等领域的爱好者提供了一个可复现的开源实践参考。 阅读详情

1. 构造器的基本概念以及存储属性直接初始化:

    1) Swift的构造器统一叫init,之所以不属于方法的范畴是因为其没有返回值,但是它也有和方法相似的功能,顾名思义和C++等的构造函数的意义是一样的,都是用来完成初始化任务,而通过类名创建实例的背后其实是调用了init构造器;

    2) Swift强行要求构造器的参数必须有外部参数名,这是因为Swift构造器可以重载,并且Swift的重载也包括返回值类型,因此有可能构造器会重载很多,为了调用时区分不同的构造器要求都必须加上外部参数名(调用时如果不适用外部参数名会直接报错的),同时Swift允许外部参数名重载,即使两个函数的函数类型完全一样,但是只要两个函数的外部参数名不同也能形成重载(这点非常之狠!这就可以各种随意重载了!超级牛逼的!);

    3) Swift要求构造器的每个参数都具有外部参数名,如果不用#修饰则内外参数名相同,当然也可以用一般的方式自己定义自己的外部参数名;

    4) 直接初始化就是指在定义存储属性的时候就对其初始化,这里需要强调一下直接初始化和调用构造器之间的先后顺序:Swift会先调用构造器对相关的属性进行初始化,接着再检查直接初始化语句,如果发现还有构造器没有初始化过的属性就是用直接初始化语句对那些属性进行初始化,而那些已经用构造器初始化过的属性就不再初始化了!

    5) 构造器可以对let定义的常量属性初始化,并且如果常量属性同时在直接初始化语句中初始化过也在构造器中初始化过也不会发生冲突而导致编译出错!为什么呢?还记得4)中讲过的规则了吗?因为如果在构造器中对其初始化过了,直接初始化语句就会被忽略掉,因此常量属性只会被初始化一次而不是两次,因此不会报错!(记住!常量只能初始化一次!)

    6) 初始化示例:

class Test
{
    var a: Int = 9 // 构造器中没初始化过就会执行此句
    let b: Int = 10 // 构造器初始化过了这句就会被忽略
    
    init(b: Int) {
        self.b = b // 先在构造器中初始化
    }
}

var t = Test(b: 27)
println("a = \(t.a), b = \(t.b)") // 9, 27

class Test2
{
    let a: Int // 不必定义时就直接初始化
    init() {
        a = 10 // 只初始化一次
    }
}
println(Test2().a) // 10
!建议所有属性只在一个地方初始化,不要即直接初始化也有构造器初始化,程序调理一定要清楚!

   

2. 默认构造器:

    1) 默认构造器就是指用户不定义任何构造器时Swift会为我们隐式提供的构造器;

    2) 对于类,默认构造器只有一个无参的空init,而对于结构体,还多了一个这样的构造器,请看如下:

还有就是可选类型的初始化一定要注意了,类和结构体有一定区别:

class A {
    // 只有一个空的无参构造器,因此无法通过用户传参构造
    // 所以必须直接初始化,否则永远也不能初始化而导致编译错误!
    var a: Int = 1
    
    // init() {} // 默认提供一个这个
}

var aa = A() // OK!
// var aa2 = A(a: 15) // Bad! 类不提供带参的逐一初始化构造器

struct B {
    var a: Int
    var b: Int
//  init() {} // 默认提供
    
//    init(a: Int, b: Int) { // 还默认提供一个这个,外部参数名和定义时一样
//        self.a = a
//        self.b = b
//    }
}

// var bb = B() // Bad!由于没有直接初始化语句,所以这种方式将导致成员无法初始化而报错!
// 但是如果有直接初始化语句就对了!

var bb = B(a: 23, b: 32) // OK!

class C_Class {
    var a: Int?
}

var cc = C_Class() // 类可以不初始化可选类型

struct C_Struct {
    var a: Int?
}

// var cc2 = C_Struct() // Bad! 但是结构体必须初始化可选类型
var cc2 = C_Struct(a: nil) // OK!
var cc3 = C_Struct(a: 13) // OK!


3. 构造器重载:

函数类型、外部参数名不同都能重载,就尽情地重载吧!

class A
{
    var a: Int = 1
    var b: Int = 2
    var c: Int = 3
    
    init() {
        a = 15
        c = 20
    }
    
    init(s: String, a: Int, b: Int) {
        println(s)
        self.a = a
        self.c = b
    }
    
    init(a: Int, c: Int) {
        self.a = a
        self.c = c
    }
    
    init(aa a: Int, cc c: Int) { // 外部参数名不同也能重载
        self.a = a
        self.c = c
    }
}


4. 构造器代理:

    1) 和Java和C++一样,为了不重复写代码会在一个构造器中调用另一个构造器;

    2) Swift也支持这个特性,这就是代理构造器,即在一个构造器中调用另一个构造器的代码,但不过调用构造器的语句必须是第一句并且仅且能调用最多一句!否则会报错!并且调用的时候一定要加self.;

    3) 结构体和类的代理构造器略有不同,结构体构造器代理非常随意,直接写就行了,而类对于调用构造器的构造器必须用convenience修饰,因此对于类的代理构造器也称为便利构造器,这里就不掩饰结构体的代理构造器了,因为只需要将class改为struct并把convenience去掉就行了:

class A {
    var a: Int = 2
    var b: Int = 5
    var c: Int = 9
    
    init(a: Int, c: Int) {
        self.a = a
        self.c = c
    }
    
    convenience init(s: String) {
        self.init(a: 20, c: 30) // 必须是第一句,并且最多只能一句,否则就会报错
        b = 13
    }
}

    4) 由于类具有继承特性(结构体没有),和C++一样,对于子类需要先调用父类构造器来初始化父类的部分,然后在执行自己的初始化语句,因此对于这类的代理就称为纵向代理(也称为向上代理),这样的构造器就是指定构造器,而对于上述的代理构造仅仅就是一个类内部之间的构造器相互代理,因此称为横向代理,构造器称为便利构造器;


5. 析构器:

    1) 同样也不属于方法,由于无参无返回值(和C++的情况一样),因此不能重载,因此有且仅有一个,名字限制为deinit,没有参数列表,因此不需要参数的括号;

    2) 也是用于清理工作,虽然Swift的ARC内存管理机制(引用计数)和Java效果一样,可以使程序员完全不用关心对象没有及时析构的问题,但是Swift仍然提供了析构器,仍然用于完成对象的清理工作,虽然实例资源不需要程序员管,但是如关闭文件等操作还是需要程序员来执行的,因此关闭文件等操作可以写在析构器代码中,因此Swift还是非常贴心周到的;

    3) 如果用户不写析构器则Swift会自动定义一个空的默认析构器;

    4) 析构器调用时机和C++的析构函数一样,都是在对象被销毁之前调用;

    5) 一个简单的示例:

class Test {
    deinit {
        println("deinit!")
    }
}

var t: Test? = Test()
t = nil // deinit!


!!!特别强调!

如果用户自定义了任何一个构造器,则默认构造器就不存在了,请看下例:

struct A {
    var a: Int
    init() {} // Bad! 编译错误
}
由于用户自定义了一个无参空构造器,因此Swift默认定义的隐式构造器都不存在了,就连注意赋值的默认构造器也不存在了,因此会导致a无法初始化而报错!

Ubuntu中 vsftpd 的安装与配置 (详细介绍) 简介 vsftpd 是一个 UNIX 类操作系统上运行的服务器的名字,它可以运行在诸如 Linux, BSD, Solaris, HP-UX 以及 IRIX 上面。它支持很多其他的 FTP 服务器不支持的特征。 vsftpd是 UNIX 操作系统中的一个开源的、免费的 FTP 服务软件。具有以下特点: 安全性高 轻小易用 支持系统用户匿名用户和虚拟用户的权限验证和相关操作 安装步骤如下: 1.将此命令复制到终端 sudo apt-get install vsftpd 2.安装完成后启动VSFTP 阅读详情

相关推荐

计算机视觉——多视图几何

多视图几何1.前言1.1 多视图几何概念2. 基本原理2.1 对极几何2.2 基础矩阵2.2.1 基础矩阵推导2.2.2 求解基础矩阵3. 实验过程3.1 实验数据准备3.2 实验代码3.3 实验结果及分析4. 实验中遇到的问题 1.前言 1.1 多视图几何概念 多视图几何是利用在不同视点所拍摄图像间的关系,来研究照相机之间或者特征之间关系的一门科学。 多视图几何(Multiple View ...

RuiMa的博客 7715

Swift(十五、构造过程(2)及析构过程)

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

弄潮者的博客 1082

8卡H20运行DeepSeek-V3-0324性能和推理实测

最近在一台 8卡H20 机器上,先后部署了 DeepSeek-R1-AWQ (671B)和最新的 DeepSeek-V3-0324 (685B) ,测试了下性能和数学问题跑分。服务器由火山引擎提供。

weixin_53138109的博客 3364

swift 析构器

析构过程原理 swift会自动释放不需要的实例以释放资源,swift通过自动引用计数处理实例的内存管理。通常当你的实例被释放时不需要手动的去清理,但是,当使用自己的资源使,可能需要进行一些额外的清理。 析构器是在实例释放发生前被自动调用,不能主动调用析构器。子类继承了父类的析构器,并且在子类析构器实现的最后,父类的析构器会被自动调用。即使子类没有提供自己的析构器,父类的析构器也同样会被调用。

ChasingDreamsCoder的博客 669

ArcGIS Pro实战:用时空立方体分析共享单车轨迹数据(含3D可视化技巧)

本文详细介绍了在ArcGIS Pro中利用时空立方体技术分析共享单车轨迹数据的全流程。从数据预处理、构建时空立方体,到执行新兴时空热点分析,并最终实现动态3D可视化,手把手教你挖掘城市骑行活动的时空规律。文章重点解析了工具参数设置、常见报错解决方案,并提供了可复用的Python脚本,助力城市规划与交通研究者高效完成时空模式挖掘。

weixin_28323057的博客 136

GR00TN1.7国内本地下载+模型下在+hugingface无法连接,本地模型下载

GR00TN1.7

alsj123456的博客 97

Swift 中的构造函数和析构函数

构造函数 构造函数是一种特殊的函数,主要用来创建对象时初始化对象,为对象的属性设置初始值,在Swift 中所有的构造函数都是 init方法并且支持构造函数的重载 代码示例//定一个基类 class Person { var name : String var age : Int //构造函数 init() { self.name = "张三"

骑着蜗牛赛跑的博客 624

保姆级教程:用Altium Designer 24从零画一块PCB(附完整库文件与避坑清单)

本文提供了一份详细的Altium Designer 24(AD24)PCB设计教程,从工程创建到最终文件输出,涵盖元件库管理、原理图设计、PCB布局布线等全流程。特别适合初学者,包含STM32最小系统板的实战案例,附完整库文件和避坑清单,帮助用户快速掌握AD24的核心功能与技巧。

weixin_27697385的博客 249

Swift的构造和析构过程

构造过程 Swift的构造过程通过定义构造器来实现。 不过与Objective-C不同的是,Swift的构造器不需要返回值,同样也不需要表明Func。 另外值得提的是,当构造器中为存储型属性赋值时,不会触发属性观测器。 定制化的构造过程 1. 除了默认的构造器外,我们可以通过增加参数的方式来为其添加自定义的构造函数或者叫便捷构造器(covenience i

RannieR的技术博客 1909

BW 技术 InfoObject 初始化,一次把 0LANGU、0CURRENCY、0IOBJNM 这些底座对象讲透

摘要:BW/4HANA和S/4HANA嵌入式分析中最容易被忽视的关键技术InfoObject(如0LANGU、0UNIT等)是系统运行的基础骨架。这些对象虽不直接涉及业务,但若未正确激活会导致多维分析、查询运行等核心功能异常。BW/4HANA中应通过任务清单SAP_BW4_SETUP_SIMPLE或SAP_BW4_SET_OPERATION_SCOPE激活,而非旧事务码RSTCO_ADMIN。S/4HANA嵌入式分析仍需依赖这些底层BW组件,配置需参考SAP Note 2636754。项目实践中需特别关注这

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1384

Spring AI Alibaba 1.x 源码分析-架构设计

本文通过分析Spring AI Alibaba 框架的源码,分析出其原理和架构设计,无论是用于项目开发、技术评估还是团队培训都具有重要价值。

program哲学 489

iOS开发之Swift篇(12)—— 构造和析构

目录 版本 构造过程 析构过程 版本 Xcode 11.3.1 Swift 5.1.3 构造过程 构造过程是使用类、结构体或枚举类型的实例之前的准备过程。这个过程包含了为实例中的每个属性设置初始值和为其执行必要的准备和初始化任务。使用关键字 init 对应的, 类的实例也可以通过实现析构器来执行它释放之前自定义的清理工作, 称为析构过程。使用关键字 deinit 构造器 构造器有很多种类型(称...

看影成痴 451

2025年GESP3月认证C++五级真题解析

小 A 有 2n 件物品,小 B 和小 C 想从小 A 手上买走这些物品。对于第 i 件物品,小 B 会以 bi 的价格购买,而小 C 会以 ci 的价格购买。对于所有测试点,保证 1 <= T <= 100, 2 <= g < p <= 10^9, g, p 为整数, p 为质数。对于所有测试点,保证 1 <= n <= 10^5, 0 <= bi, ci <= 10^9, bi, ci 为整数。对于另外 50 % 的测试点,保证 n <= 100000, 0 <= bi, ci <= 10^9。

lan_in的博客 1035

Swift之深入解析构造过程和析构过程

一、Swift 构造过程 构造过程是为了使用某个类、结构体或枚举类型的实例而进行的准备过程,这个过程包含了为实例中的每个属性设置初始值和为其执行必要的准备和初始化任务。 Swift 构造函数使用 init() 方法。与 Objective-C 中的构造器不同,Swift 的构造器无需返回值,它们的主要任务是保证新实例在第一次使用前完成正确的初始化。 类实例也可以通过定义析构器(deinitializer)在类实例释放之前执行清理内存的工作。 二、存储型属性的初始赋值 类和结构体在实例创建时,必须为所有

╰つ栺尖篴夢ゞ 4万+

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

7. Swift 构造和析构

在类,结构体,枚举的使用之前必须要进行构造过程,其中类需要通过析构过程来释放资源,结构体和枚举不需要。swift 的构造过程和 OC 的构造过程又有一些不同,swift 的构造过程不需要返回值。 构造器 构造器的一般形式 init() { // 在此处执行构造过程 } 1.默认构造器 如果结构体和类所有属性都具有默认值,同时没有自定义构造器,那么系统将提供一个默认构造...

Yan 1092

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

Swift 构造过程和析构过程

//构造过程 //定义一个类 class queen { var looks:String //构造方法 就是对类进行初始化 init() { looks = "95" } } //自定义构造方法 class MM { var age:Int //init传入指定参数 init (age:Int) { se

239

IMSL CNL 7.0.0 (x86-64)Crack

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

swift学习笔记之构造方法和析构方法

//swift的构造器(Initilizer)和析构器(Deinitializer) //构造器并不像函数和方法那样在括号前有一个可辨别的名字。所以在调用构造器时,主要通过构造器中的参数名和类型来确定需要调用的构造器。 正因为参数如此重要,如果你在定义构造器时没有提供参数的外部名字,Swift 会为每个构造器的参数自动生成一个跟内部名字相同的外部名,就相当于在每个构造参数之前加了一个哈希符号。imp

滴水可以穿石 百炼才能成钢,谋全局而通一域 致广大而尽精微 432

swift详解之七------------你真的了解构造过程吗(构造过程和析构过程)

你真的了解构造过程吗(构造过程和析构过程) 注:本文为作者整理 , 尽量没有废话,都是干货 。希望看官们可以有所收获。 1、构造过程 构造过程是为了使用某个类、结构体或枚举类型的实例而进行的准备过程。这个过程包含了为实例中的每个属性设置初始值和为其执行必要的准备和初始化任务,在类中声明一个存储型变量 ,必须为其赋初始值 。可以通过构造器为其赋值 当我们创建一个类或者结构体的时候 系统

1235

swift学习之路(十五)类的构造和析构

import Foundation class TV {     var name = "XiaoMi"          init(name:String)     {         self.name = name     }//构造          deinit{         name = ""

x13308605592的博客 351

Swift里的类继承,构造和析构代码

敲敲打打, 每天差不多一个小时来学这个, 相信到时候再用XCODE,感觉会熟悉很多。。 class Counter { var count = 0 func increment() { count += 1 } func increment(by amount: Int) { count += amount } func rese...

weixin_34101784的博客 79

swift菜鸟教程21-23(继承,构造,析构)

print("面积为:\(area = leng * bread } } let ar = Rectangle(fromLength : 6 , fromBreadth : 12) print("面积为: \( ar . area) ") let are = Rectangle(fromLeng : 36 , fromBread : 12) print("面积为: \( are . area) ")

2301_80437645的博客 936

Swift 学习总结六: 构造过程、析构过程

构造过程 构造过程是为了使用某个类、结构体或枚举类型的实例而进行的准备过程。这个过程包含了为实例中的每个属性设置初始值和为其执行必要的准备和初始化任务。 Swift 构造函数使用 init() 方法。 与 Objective-C 中的构造器不同,Swift 的构造器无需返回值,它们的主要任务是保证新实例在第一次使用前完成正确的初始化。 类实例也可以通过定义析构器(deinitializer)在类实...

jike_yangyujing的博客 240

Swift 构造与析构

前言 与 OC 一样,Swift 中也存在构造和析构过程。不同的是,OC 中的构造方法和析构方法只是普通的方法,而 Swift 中构造器和析构器是一种特殊的结构。 1、构造器 在 Swift 中,类或者结构体在初始化时必须保证它们中包含的所有属性都被初始化,构造器用来初始化类或者结构体中的属性,在形式上构造器和方法很像,但是它并不是一个方法。 声明构造器不需要 func 关键字。 和 OC...

weixin_34005042的博客 123
上一篇: [Swift]方法
下一篇: [Swift]可选链和ARC引用计数
Lirx_Tech
博客等级 码龄12年 215粉丝 148原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值