Swift - 枚举

Swift —— Enum & optional Swift —— Enum & optional1. 枚举的基本用法2. 关联值3. 模式匹配3. 枚举的大小 1. 枚举的基本用法 swift 中通过 enum 关键字来声明一个枚举 enum LGEnum{ case test_one case test_two case test_three } 在 C 或者 OC中默认受整数支持,也就意味着下面的例子中: A, B, C分别默认代表 0, 1,2 typedef NS_ENUM(NSUInteger, LGEnum) 阅读详情

Swift - 枚举

1. 枚举的基本用法

enum Direction {
    case north
    case south
    case east
    case west
}

另一种等价写法

enum Direction {
    case north, south, east, west
}

使用枚举

var dir = Direction.west
dir = Direction.east
dir = .north //已经确定类型后,就可以使用这种简写方式
print(dir) // north
switch dir {
case .north:
    print("north")
case .south:
    print("south")
case .east:
    print("east")
case .west:
    print("west")
}

2. 关联值(Associated Values)

有时将枚举的成员值跟其他类型的值关联存储在一起,会非常有用

可以理解为:将各种类型的数据直接存储到枚举变量里面去

场景: 分数(points表示实际得分,grade表示分数的等级)

enum Score {
    case points(Int)
    case grade(Character)
}
var score = Score.points(96)
score = .grade("A")
switch score {
case let .points(i):
    print(i, "points")
case  let .grade(i):
    print("grade", i)
}

场景:日期(digit表示使用年月日形式,string表示使用字符串形式)

enum Date {
    case digit(year: Int, month: Int, day: Int)
    case string(String)
}
var date = Date.digit(year: 2011, month: 9, day: 10)
date = .string("2011-09-10")
switch date {
case .digit(let year, let month, let day):
    print(year, month, day)
case let .string(value):
    print(value)
}

必要时let也可以改为var

分别设置每一个参数

case .digit(let year, var month, let day):
    print(year, month, day)

表示全部使用let

case let .digit(year, month, day):
    print(year, month, day)

表示全部使用var

case var .digit(year, month, day):
    print(year, month, day)

3. 关联值举例

常用密码形式有数字密码、手势密码

iShot_2024-04-27_11.03.01

定义枚举:number代表是数字密码;gesture代表手势密码

enum Password {
    case number(Int, Int, Int, Int, Int, Int)
    case gesture(String)
}
var pwd = Password.number(3, 5, 7, 8, 0, 9)
pwd = .gesture("14789")
switch pwd {
case let .number(n1, n2, n3, n4, n5, n6):
    print("number is ", n1, n2, n3, n4, n5, n6)
case let .gesture(str):
    print("gesture is ", str)
}

4. 原始值

枚举成员可以使用相同类型的默认值预先对应,这个默认值叫做:原始值

扑克牌示例

enum PokerSuit : Character {
    case spade = "♠️"
    case heart = "♥️"
    case diamond = "♦️"
    case club = "♣️"
}

var suit = PokerSuit.spade
print(suit)  // suit
print(suit.rawValue)  // ♠️
print(PokerSuit.club.rawValue)  // ♣️

等级示例

enum Grade : String {
    case perfect = "A"
    case great = "B"
    case good = "C"
    case bad = "D"
}

print(Grade.perfect.rawValue)  // A
print(Grade.great.rawValue)  // B
print(Grade.good.rawValue)  // C
print(Grade.bad.rawValue)  // D

注意:原始值不占用枚举变量的内存

5. 隐式原始值(Implicitly Assigned Raw Values)

如果枚举的原始值类型是Int、String,Swift会自动分配原始值

String

enum Direction : String {
    case north = "north"
    case south = "south"
    case east = "east"
    case west = "west"
}

等价于

enum Direction : String {
    case north, south, east, west
}

打印:

print(Direction.north)  // north
print(Direction.north.rawValue)  // north

Int

默认Int原始值从0开始顺序递增

// 季节
enum Season : Int {
    case spring, summer, autumn, winter
}
print(Season.spring.rawValue)  // 1
print(Season.summer.rawValue)  // 2
print(Season.autumn.rawValue)  // 3
print(Season.winter.rawValue)  // 4

自定义Int原始值

enum Season : Int {
    case spring = 1, summer, autumn = 4, winter
}
print(Season.spring.rawValue)  // 1
print(Season.summer.rawValue)  // 2
print(Season.autumn.rawValue)  // 4
print(Season.winter.rawValue)  // 5

6. 递归枚举(Recursive Enumeration)

枚举类型里面,case用到枚举类型是自己本身,就叫做递归枚举。

递归枚举必须使用indirect关键字

indirect enum ArithExpr {
    case number(Int)
    case sum(ArithExpr, ArithExpr)
    case difference(ArithExpr, ArithExpr)
}

也可以有用到递归枚举的case才写indirect

enum ArithExpr {
    case number(Int)
    indirect case sum(ArithExpr, ArithExpr)
    indirect case difference(ArithExpr, ArithExpr)
}

7. MemoryLayout

可以使用MemoryLayout获取数据类型占用的内存大小

使用方法

var age = 10
MemoryLayout<Int>.size // 获取实际使用多少内存
MemoryLayout<Int>.stride // 获取系统分配了多少内存
MemoryLayout<Int>.alignment // 获取内存对其的大小

MemoryLayout.size(ofValue: age)
MemoryLayout.stride(ofValue: age)
MemoryLayout.alignment(ofValue: age)

关联值类型

enum Password {
    case number(Int, Int, Int, Int)
    case other
}
var pwd = Password.number(5, 6, 4, 7)
pwd = .other

MemoryLayout<Password>.size  // 33
MemoryLayout<Password>.stride  // 40
MemoryLayout<Password>.alignment  // 8

分析:

  • .size为33,是number(32字节)+other(1字节)。number是关联值类型,实际会把值存储到变量里去,所以这边需要32字节。但是如果把other一起存储在这32字节,就无法区分判断number、other,所以other单独分配了一个字节
  • .stride为40,是因为内存对其,实际使用了33字节,对其后就是40

原始值类型

enum Season : Int {
    case spring, summer, autumn, winter
}
var s = Season.spring  // 0
var s1 = Season.spring  // 0
var s2 = Season.spring  // 0

MemoryLayout<Season>.size  // 1
MemoryLayout<Season>.stride  // 1
MemoryLayout<Season>.alignment  // 1

分析:

  • 原始值占用的是1字节
  • 因为原始值一开始就固定了,使用1字节就能够表示。

如下,String的原始值的枚举又是怎样的?

enum Season : String {
    case spring = "aaa", summer, autumn, winter
}

实际上它也都是1

这时候枚举仍然使用0 1 2 3来表示每一个case就行,要获取原始值则使用.rawValue去读取

@oubijiexi

iOS开发-Swift进阶之枚举enum! swift进阶总汇 本文主要介绍enum的常见使用形式,以及枚举大小是如何计算的 补充:添加脚本自动生成SIL 通过target -> +,选择 other -> Aggregate,然后命名为CJLScript 选中CJLScript,选择Build Phases -> New Run Script Phase 在Run Script中输入以下命令 swiftc -emit-sil ${SRCROOT}/06、EnumTest/main.swift | xcr. 阅读详情

相关推荐

Swift 枚举:深入理解与高效使用

枚举是一种自定义的数据类型,它将一组相关的值组织在一起。在 Swift 中,枚举可以包含整数、字符串、浮点数等任何类型的数据。Swift 枚举是一种强大的数据类型,它可以帮助我们更好地组织数据、管理状态以及处理业务逻辑。通过本文的介绍,相信你已经对 Swift 枚举有了更深入的了解。在实际开发中,熟练运用枚举可以让我们写出更加简洁、易读、易维护的代码。本文旨在为 Swift 开发者提供关于枚举的全面介绍,包括其定义、用法、高级用法以及实际应用。

lly202406的博客 403

Swift 枚举

1.枚举的定义 枚举在C/C++/c#中,是一个被命名的整型常数的集合, 枚举在日常生活中很常见。 例如表示星期的SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY,SATURDAY,就是一个枚举。 在 Swift 中,枚举类型是一等(first-class)类型。它们采用了很多在传统上只被类(class)所支持的特性,例如计算型属性(computed properties),用于提供枚举值的附加信息,实例方法(instance method...

俊而不逊的博客 1367

3张RTX 4090就能跑!BAGEL-7B多模态模型本地部署避坑指南(附Flash Attention安装技巧)

本文详细介绍了如何在3张RTX 4090显卡上本地部署BAGEL-7B多模态模型,包括硬件配置、环境设置、多卡并行优化及常见问题解决方案。特别提供了Flash Attention安装技巧和显存优化策略,帮助开发者高效运行这一开源多模态模型,实现文本与图像生成任务。

1a2s3d4f5g的博客 652

IOS11,Swift4从入门到精通-10枚举

本节内容转载于 http://www.swift51.com/swift4.0/chapter2/08_Enumerations.html 本页内容包含: 枚举语法 使用 Switch 语句匹配枚举值 关联值 原始值 递归枚举 枚举为一组相关的值定义了一个共同的类型,使你可以在你的代码中以类型安全的方式来使用这些值。 如果你熟悉 C 语言,你会知道在 C 语言中,枚举会为一组整型值分配相关联的名称...

liu_jiuyang的博客 337

计算机视觉-深度学习图像检测方法梳理

计算机视觉-深度学习图像检测方法梳理 由于之后要转方向啦,趁这段时间整理手中硕士研究方向的一些阅读笔记,这是一篇关于计算机视觉的基础知识梳理 先搞清一些小知识点 首先我们要弄清楚图像分类、目标定位、语义分割、实例分割的区别 a. 图像分类 :给定一张输入图像,图像分类任务旨在判断该图像所属类别; b. 目标定位 :在图像分类的基础上,我们还想知道图像中的目标具体在图像的什么位置,通常是以包围盒的(bounding box)形式; c. 语义分割 :语义分割是目标检测更进阶的任务,目标检测只需要框出每个目

qq_41662991的博客 9953

【STM32】IEC60730 Class B软件安全实现 Part2:自检库实战指南

本文是STM32 IEC60730 Class B软件安全实现的实战指南,详细介绍了如何将X-CUBE-CLASSB自检库集成到用户项目中。内容涵盖软件包解构、内存划分、启动与运行时自检的集成步骤、关键代码示例及调试技巧,并阐述了为最终通过安全认证所需的文档与流程准备,帮助开发者高效实现MCU功能安全。

weixin_29185167的博客 89

oc使用swift中的枚举_Swift中的枚举

oc使用swift中的枚举Enumeration is a data type that allows you to define a list of possible values. An enum allows you to create a data type with those set of values so that they can be recognised consistent...

weixin_26638123的博客 4680

免费测试国外大模型Claude 3.7 Sonnet API:无需api key(秘钥)

Claude 3.7 Sonnet是Anthropic公司推出的第三代Claude系列AI模型中的中规模版本(2024年发布),在性能与效率间实现平衡。该模型基于改进的Transformer架构,支持128K上下文窗口,擅长复杂推理、数学计算和创意写作,在GSM8K数学基准测试中准确率达92%。其采用"宪法AI"伦理框架,通过多轮对抗训练减少有害输出,同时新增多模态理解能力(可解析图片/图表内容)。Claude 3.7 Sonnet是Anthropic推出的高效轻量级大模型,主打快速响应与成本优化。

Explinks的博客 1497

swift枚举

原文出自:标哥的技术博客 前言枚举为一组相关的值定义了一个共同的类型,使你可以在你的代码中以类型安全的方式来使用这些值,当然还有一个很重要的是它可能智能提示。在C语言中,枚举会为一组整型值分配相关联的名称。Swift中的枚举更加灵活,不必给每一个枚举成员提供一个值。如果给枚举成员提供一个值(原始值),则该值的类型可以是字符串、字符、整型值或浮点数。此外,枚举成员可以指定任意类型的关联值存储到枚举成员

标哥 1118

电容式三点式振荡电路/电感式三点振荡电路基础知识及Multisim电路仿真

摘要:三极管振荡电路利用放大特性与正反馈实现自激振荡,需满足巴克豪森条件(增益≥1,相位匹配)。核心由放大级、反馈网络、选频网络和稳幅环节构成。主要分为三类:1)LC/RC正弦波振荡电路(如电容三点式、电感三点式),输出高频/低频正弦波;2)多谐振荡电路,通过电容充放电产生方波;3)张弛振荡电路,生成锯齿波等。设计需关注相位匹配、增益控制和元件适配。LC振荡频率由谐振参数决定,RC振荡由时间常数控制。稳幅机制通过非线性或主动元件维持等幅输出。该电路在信号发生、时钟源等领域有广泛应用。

XU157303764的博客 2036

Google Earth Engine:计算逐年全球潜在蒸发量(PET)的 ERA 数据

通过获取温度、湿度和降水数据,并使用Penman-Monteith公式,我们可以得到每年的潜在蒸发量。在本文中,我们将使用Google Earth Engine平台和ERA(欧洲再分析气象数据集)数据来计算逐年全球的潜在蒸发量(PET)。接下来,我们需要对ERA数据进行预处理,以获取我们需要的潜在蒸发量数据。有了温度、湿度和降水数据,我们可以使用Penman-Monteith公式来计算每年的潜在蒸发量。最后,我们可以将计算得到的潜在蒸发量数据进行可视化,以便更好地理解全球的水汽蒸发情况。

VwajAlgorithm的博客 730

swift 枚举

枚举允许用户定义一组相关联的值,然后以一个安全的方式来使用它。定义枚举先来定义一个简单的枚举Directionenum Direction{ case Left case Right case Top case Bottom }每个值都定义在一个case后面。也可以使用一个case来定义一组值,像这样enum Direction{ case Left , Ri

朱登凯的专栏 1515

STM32 TIM3硬件XOR+复位模式实现霍尔信号精准捕获

霍尔传感器是电机控制系统中获取转子位置的关键器件,其三路数字信号需通过高精度、低延迟的边沿检测机制转换为电角度信息。其核心原理在于利用定时器输入XOR逻辑合并多路信号,并结合从模式复位(Reset Mode)实现硬件级时间间隔测量——每次跳变强制计数器清零,使CNT值直接表征换相周期。该方案规避了软件轮询的不确定性,显著提升FOC控制的实时性与鲁棒性。典型应用场景包括BLDC/FOC电机驱动、机器人关节伺服及工业变频器设计,尤其适用于STM32F4系列等具备硬件XOR与从模式控制器的MCU平台。

weixin_28931507的博客 91

Swift-枚举

枚举定义了一个通用类型的一组相关值,使你可以在你的代码中以一种安全的方式来使用这些值。 如果你熟悉 C 语言,你就会知道,在 C 语言中枚举将枚举名和一个整型值相对应。Swift 中的枚举更加灵活,不必给每一个枚举成员提供一个值。如果给枚举成员提供一个值(称为“原始”值),则该值的类型可以是字符串,字符,或是一个整型值或浮点数。 此外,枚举成员可以指定任何类型的相关值存储到枚举成

欢迎来到Jack的程序世界 2016

22、硬件工程师笔试面试——电机(2025版本)

例如,B级绝缘的电机可以承受的最高温度为130℃,而H级绝缘的电机可以承受高达180℃的温度。同时,也要考虑电机的成本和控制系统的复杂性。电机的选择取决于其应用的具体要求,包括所需的功率、速度、扭矩、效率、成本和工作环境等。根据电动机保护配置原则,为电机配置适当的保护,如过负荷保护、缺相保护、逆相保护、接地漏电保护、堵转保护、相不平衡保护、短路保护、过电压保护、低电压保护、过热保护等。根据安培环路定理,电流和磁场的相互作用会在电机的转子上产生力,这些力作用于转子上,使其绕轴旋转,从而产生转矩。

XU157303764的博客 3537

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

闲聊Swift的枚举关联值

枚举,字面上理解,就是把东西一件件列出来。在许多计算机语言中,枚举都是一种重要的数据结构。使用枚举可以使代码更简洁,语义性更强,更加健壮。Swift语言也不例外。但和其他语言相比,Swift的枚举有一个关联值的概念。什么是关联值呢?关联值是枚举项存放的额外的数据,这些额外的数据可以使枚举描述更复杂的结构 ,实现更复杂的需求。下面定义了一个枚举,其中的每个枚举项都具有关联值。在上述枚举定义中,begin项关联了一个类型为String的值,枚举项表示开始,其关联值进一步表示是什么具体过程。progress。

m0_65012566的博客 2700

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

swift和oc枚举的区别

swift 1.case后面可以用逗号隔开写很多枚举值 2.枚举里可以写方法 3.枚举的rawValue可以是Float(float也是赋值的后面依次+1)或是String,或是没有 enum Suit{ case spades, hearts, diamonds, clubs func simpleDescription() -> String { switch self { case .spades: return "spa

baidu_40537062的博客 3112

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

Swift 中枚举的基本用法

一、枚举语法 //枚举的语法:名称需要首字母大写 enum Direction { case north case south case west case east } //多个成员值可以出现在同一行中,要用逗号隔开 enum Direction2 { case north, south, west, east } 二、使用 Switch 语句来匹配枚举值 enum Direction { case north, south, west, east } /

same_life的博客 3889

oc 中用swift中枚举_Swift中的枚举,元组和泛型

oc 中用swift中枚举A brief discussion on how to uses enum, generics, and tuples in the Swift programming language. 简要讨论如何在Swift编程语言中使用枚举,泛型和元组。 总览 (Overview) Like other programming languages, Swift also h...

weixin_26638123的博客 1336

oc 中用swift中枚举_在Swift中安全地解码枚举

oc 中用swift中枚举Typically, when working with REST APIs, developers try to ensure code safety to avoid unpredictable behaviour of their apps. This is especially true when working with external APIs with l...

weixin_26638123的博客 559

Swift枚举的全用法

鉴于昨天开会部门会议讨论的时候,发现有些朋友对枚举的用法还是存在一些疑问,所以就写下这个文章,介绍下Swift下的枚举的用法。 基本的枚举类型 来,二话不说,我们先贴一个最基本的枚举: enum Movement { case letf case right case top case bottom } 这里就定义了一个简单的...

weixin_30627381的博客 187

Swift里的枚举

枚举为一组相关的值定义了一个共同的类型,使你可以在你的代码中以类型安全的方式来使用这些值 参考:枚举类型

379
上一篇: Swift - 函数
下一篇: Swift - 可选项(Optional)
aiousee
博客等级 码龄14年 540粉丝 45原创
评论 6
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值