[Swift]结构体和类的基本概念

【Swift学习】Enum、Struct、Class的学习及异同 .. 阅读详情

1. Swift的类和结构体的异同:

    1) Swift非常重视结构体的作用,并提供了结构体非常强大的面向对象支持;

    2) 结构体和类的共有属性:

        i) 都可以定义数据成员(这是必然的);

        ii) 都可以定义属性(计算属性和存储属性);

        iii) 都可以定义附属脚本(下标访问,特别是基本类型中的数组和字典都都是用结构体定义的,并且支持下标访问,Swift的下标访问实质上使用附属脚本定义的);

        iv) 都可以定义方法;

        v) 都有构造器(注意,Swift中的构造器不等于方法,之后在概念上要作区分);

        vi) 都支持扩展和协议;

    3) 只有类具备但结构体不具备的更强大的功能:

         i) 支持继承;

         ii) 支持运行时强制类型转换;

         iii) 支持析构;

         iv) 支持ARC引用计数(只有类是引用类型的,结构体是值类型的,因此无法引用,也就提不上引用计数管理了);


2. 类和结构体的定义:

    1) 和Java定义类的方式相似,都要求所有类和结构体的内容都定义在类体和结构体内部,而不是像C++和OC那样将实现和声明分文件编写;

    2) 一个简单地定义类和结构体的例子:

class Employee
{
    var no: Int = 0
    var name: String = ""
    var job: String? // 可以无业
    var salary: Double = 0.0
    var dept: Department? // 无业就没有所属部门
}

struct Department // 这里不像C++,Department必须定义在Employee前面
{ // Swift会先扫描整个文件并记录所有出现的符号,因此不需要前向引用声明
    var no: Int = 0
    var name: String = ""
}

class A
{
    
}

struct B // 当然也可以在结构体中添加类对象成员
{
    var a: A
}
注意!可以在类中添加结构体成员,也可以在结构体中添加类成员,这是随意的;

同时和Java一样,没有前向引用声明的概念,一个类中使用另一个类则另一个类不必非得定义在该类之前,Swift会扫描整个文件并记录所有出现的符号;


3. 实例化和访问成员:

    1) 利用结构体和类的构造器实例化即可(接上例的代码):

var emp1 = Employee()
var emp2: Employee = Employee()

var dept1 = Department()
var dept2: Department = Department()
注意!这里调用的是它们的无参构造器(构造器之后会讲);

    2) Swift摒弃了Java中非常繁琐的每次实例化对象都需要用new操作符的习惯,Swift也是将引用类型的对象都放在堆中管理,因此这点需要程序员记在心里即可,不必使用new之类的操作符来强调这个问题;

    3) 实例化和实例是一个广义上的概念:枚举、函数类型和闭包开辟内存的过程也可以成为实例化,而这些开辟的结果只能称作实例,只有类类型开辟的结果才可以成为对象(当然也可以成为实例); 

    2) 访问成员的方式和传统语言一样,都是使用成员运算符.进行访问的,比如emp1.no = 10111;


4. 值类型和引用类型之间的区别强调:

    1) Swift中只有类类型是引用类型,其余的一切类型都是值类型的,值类型和引用类型最大的区别就是值类型的变量或常量代表的就是数据本身,而类类型的变量或常量只是一个引用(就相当于C++中的指针),该引用指向堆中真正的类的对象实体,引用之间的赋值可以使多个引用指向同一个实体,但值类型之间的赋值就是完完全全拷贝其中的内容;

其实最重要的地方是在函数传参阶段,值类型数据传参就是完全拷贝一份而引用类型的传参仅仅是拷贝一份引用,而对象实体本身就那么一份而不会拷贝,引用的复制仅仅就是多了一个函数参数引用该对象的实体罢了,因此在函数中通过引用参数来修改对象中的内容会直接影响函数外指向该对象的那个引用(其实外面的应用没变,只不过通过该引用访问的对象的内容会由于函数内的修改而发生改变),但是在函数内对值类型数据修改就不会影响函数外的那个值类型数据,因为函数内的仅仅是一个拷贝,和函数外的那份完全不相干;

!因此,通常结构体不宜定义地过大(一般定义成一个较小的数据包),因为传参的时候是要拷贝的,如果体积庞大则拷贝非常消耗资源!

    2) 两者之间的区别演示:

class A
{
    var a: Int = 1
    var b: Int = 2
}

var a = A()
var aa = a

aa.a = 100
aa.b = 100
println("a.a = \(a.a), a.b = \(a.b)") // 100, 100

func changeA(ra: A) // 默认为let的,在let情况下只有通过引用才能访问成员,因此是引用类型
{
    ra.a = 5
    ra.b = 5
}
changeA(a)
println("a.a = \(a.a), a.b = \(a.b)") // 5, 5

struct B
{
    var a: Int = 1
    var b: Int = 2
}

var b = B()
var bb = b

bb.a = 100
bb.b = 100
println("b.a = \(b.a), b.b = \(b.b)") // 1, 2,没变,因此bb只是一份拷贝而已

//func changeB(eb: B) // Bad! 默认情况是let,let的值类型是不能改变其成员!因此是struct是值类型的
//{
//    eb.a = 300
//    eb.b = 300
//}

func changeB(var eb: B) // 修改成var或inout就可以了
{
    eb.a = 300
    eb.b = 300
}
changeB(b)
println("b.a = \(b.a), b.b = \(b.b)") // 1, 2,还是没变,传入函数的只是拷贝

func changeBByRef(inout rb: B) // 输入输出参数即强行引用传递
{
    rb.a = 300
    rb.b = 300
}
changeBByRef(&b)
println("b.a = \(b.a), b.b = \(b.b)") // 300, 300
    3) 也演示一下枚举类型(也是一种值类型):

enum Dir: String
{
    case East = "East"
    case South = "South"
    case West = "West"
    case North = "North"
}

var d1 = Dir.East
var d2 = d1

d2 = Dir.West
println(d1.rawValue) // East
    4) 引用之间的比较:

         i) ===和!==用于比较两个引用是否相等(即指针的指向是否相同),即是否引用了同一个对象);

         ii) ==和!=用于比较两个引用指向的对象的内容是否相同,但前提是必须先对类的==运算符进行重载否则会直接编译报错!


5. 类型嵌套:

功能和Java的内部类相似,只不过Swift的更加灵活,枚举、结构体、类的内部之间可以随意相互定义:

class A {
    class B {}
    enum C { case k }
    struct D {}
}

enum B {
    class A {}
    enum C { case k }
    struct D {}
}

struct C {
    class A {}
    enum B { case b }
    struct D {
        class K {}
        enum H {
        case v
        class Q {}
        }
    }
}
反正就是支持各种类型之间相互嵌套,并且可以嵌套多层,但是和Java一致的是内部类型的作用域在内部,可以和外部类型重名,只不过在内部屏蔽了;


7、Swift 函数、闭包、类、结构体与枚举的使用指南 本博客详细介绍了 Swift 编程语言中函数、闭包、类、结构体和枚举的基本使用方法及高级特性。内容涵盖函数的创建与优化、嵌套函数、函数作为返回类型和参数、guard 语句的使用、闭包的理解与应用、类与结构体的声明和实例化、类与结构体的区别、枚举的定义与关联值使用,以及一个综合应用示例来展示如何结合这些特性进行实际开发。通过学习这些内容,开发者可以更好地组织和管理代码,实现复杂的功能,并提升代码的可读性和可维护性。 阅读详情

相关推荐

Win10 / Win11 启用 Hyper-V 虚拟机详细教程(图文+命令行全攻略)

摘要:本文详细介绍Windows10/11系统启用Hyper-V虚拟化平台的方法,包含专业版/企业版的图形界面和PowerShell命令行操作,以及家庭版通过脚本强制启用的特殊方案。内容涵盖版本支持对比、操作步骤图解、常见问题解答和性能优化建议,帮助开发者快速搭建虚拟化环境进行多系统测试。附微软官方文档参考链接和详细操作示意图。

ElioXu 7053

C语言小知识——结构体和共用体

结构体 结构体是将不同类型的数据成员组织到统一的名字下,适合用于对关系紧密、逻辑相关、具有相同或者不同属性的数据进行处理的一种数据结构类型。它在数据库管理中得到了广泛的应用。 结构体变量的定义 共用体 共用体虽然也能向结构体一样,表示逻辑相关的不同类型的数据集合,但其数据成员之间是互斥的,既每一时刻只有一个数据成员是起作用的。 ...

qq_50701207的博客 1018

硬件设计--DC/DC电源芯片详解

本文参考:http://www.elecfans.com/article/83/116/2018/20180207631874.html https://blog.youkuaiyun.com/wangdapao12138/article/details/79763343 第一次写博客,不喜勿喷,谢谢!!! DC/DC电源指直流转换为直流的电源,从这个定义上看,LDO(低压差线性稳压器)芯片也应该属于D...

weixin_30794499的博客 7871

swift -类的定义及使用

// // main.swift // ClassDemo-06 // import Foundation println("Hello, World!") //类的定义 Person 名字 class Person{ //定义一个字段 年龄 var age :Int = 0; //定义一个字段 名字 //?表示name 为空 nil 或者没有设置 na

FIGHTING的专栏 3302

华为设备有关用户名密码的策略配置

命令用来开启对密码进行复杂度检查功能,设备默认已经是开启状态。1、密码长度大于等于12位,含数字大小写字母和特殊符号。2、设置密码更换周期为90天。取值范围8-16,默认长度为8位。登录失败后锁定时间大于15分钟。3、登录失败次数小于5次。4、登录超时30分钟以内。

简单的创作,希望可以帮助到跟我一样的学习者! 7839

【c++教程】2.7-结构体类型

结构体 虽然在c++中,已经提供了很多种的基础数据类型。但是,即使内置再多的数据类型,也不可能总是能够很好的表达所有的用户需求。因此,必须要让用户能够自己定义数据类型。结构体就是一种可以自行定义的数据类型,结构体中可以存放一个对象的很多种信息。 结构体的使用 使用关键字struct,定义结构体 #include <iostream> #include <string> using namespace std; int main() { struct studen

程程之光 356

自定义串口通讯协议

自定义串口通讯协议的实现方法

qq_44826038的博客 2172

Swift基础语法: 25 - Swift的类和结构体

Swift的类和结构体

Cain For iOS的专栏 435

C#与欧姆龙PLC 通信——Fins Tcp协议

该调试助手专门为了帮助大家学习以及测试Fins-Tcp通信,下面进行详细介绍。

qq_34059233的博客 2080

独创改进 | RT-DETR 引入 Asymptotic Hybrid Encoder | 渐进混合特征解码结构

独创改进🚀! | RT-DETR 引入 Asymptotic Hybrid Encoder | 渐进混合特征解码结构

Coding... 2211

Swift结构体和类

Swift结构体和类定义一个类或者结构体结构体和类有着类似的定义方式,我们可以通过class 和struct来进行定义。struct Resolution { var width = 0 var height = 0 }//定义一个结构体 //在这个结构体中,两个变量被赋值为0,所以被认为是整型变量 //结构体总是以复制的方式传递dsdddddsf class VideoMode {

GYZ的csdn 828

数据处理和分析之数据聚类:层次聚类(Hierarchical Clustering):单链接层次聚类方法

单链接层次聚类(Single-Linkage Hierarchical Clustering)是凝聚型层次聚类的一种,它基于数据点之间的最小距离来定义聚类间的相似性。在单链接层次聚类中,两个聚类之间的距离定义为这两个聚类中任意两个数据点之间的最短距离。这种聚类方法倾向于形成链状或线性的聚类,因为聚类的边界是由最远的数据点决定的,而不是聚类的平均或中心位置。单链接层次聚类通过计算簇间最近点的距离来决定簇的合并,这种方法简单直观,但可能导致簇的形状不规则,尤其是在数据点分布不均匀的情况下。

2401_87715305的博客 1441

swift-04-枚举、结构体、类

swift-04-枚举、结构体、类 一、枚举 1、介绍 enum:枚举是一种类型,可以像类和结构体一样,拥有自己的属性和方法 swift中的枚举,可以提供的值类型有:字符串,字符,整型值,浮点值等。这一点不同于oc,oc中是默认整型值 //定义Int类型的枚举 enum CompassPoint:Int { case North case South case East case West } let stt: CompassPoint = .South //通过rawVal

box_kun的博客 314

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Swift类和结构体(Classes and Structures)

在Swift中,类和结构体是通用且灵活的架构,枚举是一组相关的值的集合,并允许你在代码中使用它们。你可以在类和结构体中添加属性和方法,如常量、变量和函数。相对于其他编程语言,当你想创建类和结构体时,需要创建接口文件和实现文件。Swift不需要你创建接口文件和实现文件,如玩过OC的朋友都知道.h和.m文件。在Swift中,当你想创建类和结构体时,只需要创建一个文件。这个类和结构的外部接口可自动给其他代

路漫漫其修远兮,吾将上下而求索! 698

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

Swift 结构体简单学习

定义 /// 这里我定义了一个结构体类型 /// 结构体类型是一个新的Siwft类型 (命名类似于 Int Double) /// 用来描述一个人的所带属性 name = "" age = 0 struct PersonStruct { var name = " " var age = 0 } /// 接下来我定义了一个类

夏天然后的技术专栏 1386

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Swift基本概念(三)

Swift##Classes * The way we declare classes in Swift is also different. – Swift Does not use header / source separation – Swift classes are made up in the one .swift file * Swift allows classes a...

YUU_Gao的博客 576

Swift 基础 ---类和结构体

类和结构体 Swfit并不要求你为自定义类和结构去创建独立的接口和实现文件,只需要在一个文件定义一个类或结构体,Swift自动生成外部接口 通常类的实例被称为对象,Swift中称为实例而不是对象 1.定义 通过class和struct来声明结构体,大括号里定义它们的内容 [objc] view plaincopy class So

fhbystudy的专栏 1078

【Swift学习】Swift编程之旅---类和结构体(十三)

  与其他编程语言所不同的是,Swift 并不要求你为自定义类和结构去创建独立的接口和实现文件。你所要做的是在一个单一文件中定义一个类或者结构体,系统将会自动生成面向其它代码的外部接口。   注意:通常一个类的实例被称为对象。然而在Swift 中,类和结构体的关系要比在其他语言中更加的密切,本章中所讨论的大部分功能都可以用在类和结构体上。因此,我们会主要使用实例而不是对象。     比较类和...

weixin_33806300的博客 102

Swift从入门到精通第五篇 - 结构体-类 初识

结构体-类 初识(学习笔记) 环境Xcode 11.0 beta4 swift 5.1 类和结构体的共同点 可以定义属性 可以定义方法 可以用下标语法去访问(见下面的示例代码) 定义初始化器 可以通过扩展扩展其功能,使其超出默认实现 遵守协议以提供其它标准功能 struct Matrix { let rows: Int, columns: Int var grid...

weixin_30604651的博客 154

【Swift】学习笔记(八)——类和结构体

1、类和结构体的定义 struct Resolution { var width = 0 var height = 0 } class VideoMode { var resolution = Resolution() var interlaced = false var frameRate = 0.0 var name: String?

封宸落宇的专栏 708

Swift教程之结构体

import Foundation //结构体 struct Student { var name = "" var age = 0 func test() { print("test") } } //所有结构体都有一个自动生成的成员逐一构造器,用于初始化新结构体实例中成员的属性 let vga = Student(name: "

逆钟夕的忘忧阁 623

Swift-结构体的实例变量以及成员方法,结构体与类的区别

结构体的实例变量以及成员方法 /* 1、结构体定义,实例和属性访问 struct Rect-C { Double width; Double height; }; */ print("1、结构体定义") struct Rect { var width:Double = 0.0 var height:Double = 0.0 //成员方法可以访问使用

MinggeQingchun的博客 1327

07-Swift类和结构体(Classes and Structures)

类和结构体是构建代码所用的一种通用的构造体。都是可以使用完全相同的语法规则为类和结构体定义属性(常量、变量)、添加方法,从而扩展类和结构体的功能。 注意: 通常一个类的实例称之为对象。但在swift中,类和结构体的关系要比在其他语言中更加的密切。为此,更多是使用实例而不是对象。 类和结构体的共同之处: 定义属性用于存储值; 定义方法用于提供功能; 定义附属脚本用于访问值; 定义构造器用于生成...

快把钟哥带走 160

Swift基础(五):类和结构体

目录: 类和结构体初始化 类是引用类型 恒等运算符 指针 类和结构体的选择 字符串(String)、数组(Array)、和字典(Dictionary)类型的赋值与复制行为 //类和结构体初始化 struct ResolutionStruct//结构体 {     var width = 0;     var height

ceasadan的博客 384
上一篇: [Swift]枚举
下一篇: [Swift]属性和下标
Lirx_Tech
博客等级 码龄12年 215粉丝 148原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值