Swift-22-复杂数据类型

枚举enum

本小节讨论的枚举是一种基础类型,并不是对象。在Swift中,枚举有很多高级特性。

语法结构

enum EnumName : Type { case... },其中Type可以省略,{}中定义的枚举体至少包含一个case语句。

一个简单的实现如下,在名为TextAlignment的枚举中定义了4个可选的值:

enum TextAlignment {
    case left
    case right
    case center
    case justify
}

常用操作

一般就是取值和轮询这两种操作用的比较多。

enum TextAlignment {
    case left
    case right
    case center
    case justify
}

//获取
var alignment = TextAlignment.justify
var alignment:TextAlignment = TextAlignment.justify

//比较
if (alignment == TextAlignment.justify){
    
}

//用于switch,这个例子中的.left是一种简写模式,并不建议这样来写代码。
var alignment = TextAlignment.justify //justify
switch alignment {
    case .left: 
        print("left aligned")
    
    case .right:
        print("right aligned")
    
    case .center:
        print("center aligned")
    
    case .justify:
        print("justified")
}

关于:特殊写法就是点”.“,这是一种简写方法,前提是在先有第一行代码完整调用一次枚举后,才能简写(这是编译器一个自动推断数据类型功能)

//如果没这行代码,则程序会报错,但实际代码编写过程中不建议这样来写
var alignment = TextAlignment.justify 
alignment = .right

设置原始值

下面是一些细节的处理,比始原始值设置,反向查询等。

// 设置原始化,如果不设置 = 后面的原始值的话,swift会对int类型的枚举从0开始设置值,然后按元素个数依次累加
enum TextAlignment : Int {
    case left    = 20
    case right   = 30
    case center  = 40
    case justify = 50
}

//这种定义方式的话,其值默认和名称是相同的,但只局限于字符枚举
/**
enum ProgrammingLanguage : String {
    case swift 
    case objectiveC = "objective-c"
    case c
    case cpp        = "c++"
    case java
}
*/

//取值-名, ~~ justify
var alignment = TextAlignment.justify 
var alignment:TextAlignment = TextAlignment.justify 

//取值-值 : ~~ Left has raw value 20
print("Left has raw value \(TextAlignment.left.rawValue)") 

//反向查询, ~~ left
var t = TextAlignment(rawValue: 20) 

在枚举中定义函数

swift的枚举可以关联方法。

//创建一个新枚举
enum LightBulb {
    case on
    case off

    //添加一个函数
    func surfaceTemperature(forAmbientTemperature ambient: Double) -> Double {
        switch self { //self是一个隐式参数,类型是LightBulb
        case .on:
            return ambient + 150.0

        case .off:
            return ambient
        }
    }

    mutating func toggle() { //注意这个关键字的使用,否则无法更改枚举的值
        switch self {
        case .on:
            self = .off 

        case .off:
            self = .on
        }
    }
}

var bulb = LightBulb.on
let ambientTemperature = 77.0

var bulbTemperature = bulb.surfaceTemperature(forAmbientTemperature: ambientTemperature)
//the bulb's temperature is 227.0
print("the bulb's temperature is \(bulbTemperature)")

bulb.toggle() //off,相当于返回了一个值给bulb变量重新赋值
bulbTemperature = bulb.surfaceTemperature(forAmbientTemperature: ambientTemperature)
//the bulb's temperature is 77.0
print("the bulb's temperature is \(bulbTemperature)")

mutating关键字,在swift中枚举是值类型,而值类型的方法不能对self进行修改,如果想修改需要声明 mutaing 关键字

给枚举元素设置不同的值

这个功能可以把数据附在枚举实例上,不同的成员可以有不同类型的关联值。

enum ShapeDimensions {
    // 点没有关联值
    case point
    
    // 正方形的关联值是边长,类型是(元组)
    case square(side: Double)

    // 长方形的关联值是宽和高,类型是(元组)
    case rectangle(width: Double, height: Double)
    
    //面积计算
    func area() -> Double {
        switch self {
        case .point:
            return 0
    
        case let .square(side: side):
            print("hi")
            return side * side
    
        case let .rectangle(width: w, height: h):
            return w * h
        }
    }
}
//square(side: 10.0),创建了一个边长是10的正方形
var squareShape = ShapeDimensions.square(side: 10.0) 
//rectangle(width: 5.0, height: 10.0),创建了宽和高为5*10的长方形
var rectShape = ShapeDimensions.rectangle(width: 5.0, height: 10.0) 

//~~ square's area = 100.0
print("square's area = \(squareShape.area())")
//~~ rectangle's area = 50.0
print("rectangle's area = \(rectShape.area())")

//~~ point's area = 0.0
var pointShape = ShapeDimensions.point
print("point's area = \(pointShape.area())")

用枚举实现递归

构建如下图所示的族谱
在这里插入图片描述

indirect关键字是为了递归数据内存占用不确定而增设的。fatherAncestors是祖先的意思

enum FamilyTree {
    case noKnownParents
    indirect case oneKnownParent(name: String, ancestors: FamilyTree)
    indirect case twoKnownParents(fatherName: String, fatherAncestors: FamilyTree,
        motherName: String, motherAncestors: FamilyTree)
}

//~~ twoKnownParents(fatherName: "Fred Sr.", fatherAncestors: 
let fredAncestors = FamilyTree.twoKnownParents(
    fatherName: "Fred Sr.",
    fatherAncestors: .oneKnownParent(name: "Matilta",
        ancestors: .noKnownParents),
    motherName: "Marsha",
    motherAncestors: .noKnownParents)

在这里插入图片描述

indirect 关键字,用来告诉编译器把枚举的数据放到一个指针指向的地方,防止内存溢出。

本质来说,这东西是用来代替Objective-C的头文件的。

结构体

结构体(struct)是把相关数据块组合在一起放在内存中的一种类型。当需要把数据组合为一种通用类型时就可以用结构体。

语法结构: struct structName { },可定义属性也可以定义方法,可简单理解为类的简化版本

简单示例

//Town.swift
struct Town { //定义了一个名为Town的结构体
    //定义了两个属性
    var population = 5422
    var numberOfStoplights = 4
    
    //定义实例方法
    func printDescription() {
        print("Population: \(population); number of stop lights: \(numberOfStoplights)")
    }
    
    //修改方法,需要添加mutating关键字
    mutating func changePopulation(by amount: Int) {
        population += amount
    }
}

测试代码

//main.swift
import Foundation

var myTown = Town();
print(myTown.population) //5422

myTown.printDescription() //Population: 5422; number of stop lights: 4

myTown.changePopulation(by: 500)
print(myTown.population)  //5922

也可以在结构体中定义类型方法

struct Town {
    static func numberOfSides() -> Int {
        return 4
    }
} //Town.numberOfSides()    

结构体中定义静态方法

上面例子中如果在结构体中定义了方法都需要先实例化结构体,再进行方法调用,如果用static进行声明后就不需要实例化枚举了。如下:

struct Square {
    static func number() -> Int{
        return 4
    }
}

let v = Square.number()

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

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

相关文章

【Lattice FPGA 开发】Modelsim与Diamond联合仿真

本文讲解Modelsim与Diamond进行联合仿真步骤,以及对遇到问题的解决与说明。 文章目录 软件版本0. Diamond设置文件为仿真文件特别注意 1. Diamond设置仿真软件为Modelsim2. Modelsim编译Lattice的库文件2.1 新建文件夹存放库文件2.2 Modelsim中建立新的仿真库2.2.1…

推荐一款websocket接口测试工具

网址:Websocket在线测试-Websocket接口测试-Websocket模拟请求工具 http://www.jsons.cn/websocket/ 很简单输入以ws开后的网址就可以了 这个网址是你后台设置的 如果连接成功会砸提示框内显示相关字样,反之则不行

【计算机毕业设计】学习平台产品功能介绍——后附源码

🎉**欢迎来到我的技术世界!**🎉 📘 博主小档案: 一名来自世界500强的资深程序媛,毕业于国内知名985高校。 🔧 技术专长: 在深度学习任务中展现出卓越的能力,包括但不限于…

Grid Controller

完整、易于使用的基于网格的第一人称控制器,具有《格里姆洛克传奇》、《地下城大师》和《巫师》的风格。 网格控制器是一种基于网格的第一人称控制器,设置简单,但具有鲁棒性和通用性。不需要脚本。 特征: 实时或基于回合的移动 平滑移动或即时捕捉到网格位置 倾斜、下降和蹲…

vivado 使用 JTAG-to-AXI Master 调试核进行硬件系统通信

使用 JTAG-to-AXI Master 调试核进行硬件系统通信 JTAG-to-AXI Master 调试核为可自定义核 , 可在运行时生成 AXI 传输事务并驱动 FPGA 内部的 AXI 信号。该核支持所 有存储器映射型 AXI 接口和 AXI4-Lite 接口 , 并且可支持位宽为 32 或 64 …

web安全学习笔记(12)

记一下第十六节课的内容。 一、jQuery Ajax 我们要先下载jQuery。 首先我们转移到template目录下,准备把jQuery下载到这下面。 直接wget下来就可以了。 这样我们就下载好了jQuery,下面我们学习如何使用。 jQuery 调用 ajax 方法 格式:$.…

CMC学习系列 (12):卒中患者的前三角肌和肱肌的 CMC 显著降低

卒中患者的前三角肌和肱肌的 CMC 显著降低 0. 引言1. 主要贡献2. 方法2.1 患者信息2.2 实验范式2.3 相干性计算 3. 结果4. 讨论5. 总结欢迎来稿 论文地址:https://www.sciencedirect.com/science/article/abs/pii/S1388245709002363 论文题目:Functional…

PLC工业网关,实现PLC联网

在当今工业自动化领域,PLC(可编程逻辑控制器)作为控制系统的核心,其稳定性和可靠性至关重要。然而,随着工业互联网和智能制造的快速发展,如何实现PLC的联网通信,提高数据传输效率,成…

电脑做Vlog有哪些软件 做电脑Vlog需要什么 电脑做vlog的视频软件 会声会影2023新功能

VLOG是指视频博客(Video Blog),是一种通过视频形式记录和分享个人生活、经验、观点等的方式。类似于传统的博客,VLOG允许人们通过视频来表达自己的想法和感受,通常包括日常生活、旅行经历、美食探索、技能展示等内容。…

单链表的基本操作实现:初始化、尾插法、头插法、输出单链表、求表长、按序号查找、按值查找、插入结点、删除结点。

1.参考学习博文(写的相当好的文章): http://t.csdnimg.cn/AipNl 2.关于我的总结: 定义单链表: typedef struct LNode {Elemtype data;struct LNode* next; }LNode; data用来存放元素值,next用来指向后…

go语言是如何实现协程的

写在文章开头 go语言的精华就在于协程的设计,只有理解协程的设计思想和工作机制,才能确保我们能够完全的利用协程编写强大的并发程序。 Hi,我是 sharkChili ,是个不断在硬核技术上作死的 java coder ,是 CSDN的博客专…

【云计算】云计算八股与云开发核心技术(虚拟化、分布式、容器化)

【云计算】云计算八股与云开发核心技术(虚拟化、分布式、容器化) 文章目录 一、什么是云计算?1、云计算的架构(基础设施,平台,软件)2、云计算的发展 二、如何做云计算开发?云计算的核…

IBM SPSS Statistics for Mac:数据分析的卓越工具

IBM SPSS Statistics for Mac是一款功能强大的数据分析软件,专为Mac用户设计,提供了一系列专业的统计分析和数据管理功能。无论是科研人员、数据分析师还是学生,都能从中获得高效、准确的数据分析支持。 IBM SPSS Statistics for Mac v27.0.1…

管道流设计模式结合业务

文章目录 流程图代码实现pomcontextEventContextBizTypeAbstractEventContext filterEventFilterAbstractEventFilterEventFilterChainFilterChainPipelineDefaultEventFilterChain selectorFilterSelectorDefaultFilterSelector 调用代码PipelineApplicationcontrollerentitys…

在C#中,PDFsharp库使用(三):PDF提取

PDF提取 一、PDF提取功能,看图 二、PDF提取界面 三、PDF提取代码 //pdf提取---选择文件Button private void button9_Click(object sender, EventArgs e) {string oneFilePath GetOneFilepath();if (!string.IsNullOrEmpty(oneFilePath)){textBox3.Text oneFilePa…

springboot汽车企业公司网站的系统设计ssm-java

框架:SSM/springboot都有 jdk版本:1.8 及以上 ide工具:IDEA 或者eclipse 数据库: mysql 编程语言: java 前端:layuibootstrapjsp 详细技术:HTMLCSSJSjspspringmvcmybatisMYSQLMAVENtomcat 开发工具 IntelliJ IDEA: 一…

带小数点的String类型数据,如何只取整数?

一、场景引入 如果前端页面存在列表展示用户数据,但是用户数据存在非常多的小数位,从页面来看,数据太多就会不太美观,因此,出于场景美化考虑,在不影响业务功能的情况下,可以只展示整数内容&…

00_Linux

文章目录 LinuxLinux操作系统的组成Linux的文件系统Linux操作系统中的文件类型Linux操作系统的组织结构 Linux vs WindowsNAT vs 桥接模式 vs 仅主机Linux Shell命令Linux⽂件与⽬录管理相关指令目录文件普通文件文本编辑 用户管理添加用户删除用户用户组管理 文件权限管理权限…

家庭营销广告Criteo公司首次获得MRC零售媒体测量认证

家庭营销广告Criteo公司首次获得零售媒体测量MRC认证 商业媒体公司Criteo2024年3月28日宣布,它首次获得媒体评级委员会(MRC)的认证,在其企业零售媒体平台commerce Max和commerce Yield上,在桌面、移动网络和移动应用内…

PCL SAC_IA配准高阶用法——统计每次迭代的配准误差并可视化

目录 一、概述二、代码实现三、可视化代码四、结果展示本文由CSDN点云侠原创,原文链接。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫。 一、概述 在进行论文写作时,需要做对比实验,来分析改进算法的性能,期间用到了迭代误差分布统计的比较分析,为直…