type
status
date
slug
summary
tags
category
icon
password
example-row
example-row
枚举为一组相关的值定义了一个共同的类型,以便类型安全的方式来使用这些值。
- 每一项可以用
case
来表示,也可以简写,只写一个case
,后面的成员用,
隔开。
- 可以确定类型,也可以不确定。
- 不必给每一个枚举成员提供一个值。
- 如果给枚举成员提供一个值(称为原始值),则该值的类型可以是字符串、字符,或是一个整型值或浮点数。
- 与 C 和 Objective-C 不同,Swift 的枚举成员在被创建时不会被赋予一个默认的整型值。
关联值
定义一个名为
Barcode
的枚举类型,它的一个成员值是具有 (Int,Int,Int,Int)
类型关联值的 upc
,另一个成员值是具有 String
类型关联值的 qrCode
。这个定义不提供任何 Int
或 String
类型的关联值,它只是定义了,当 Barcode
常量和变量等于 Barcode.upc
或 Barcode.qrCode
时,可以存储的关联值的类型。原始值
枚举成员可以被默认值(称为原始值)预填充,这些原始值的类型必须相同。
- 原始值可以是字符串、字符,或者任意整型值或浮点型值。
- 每个原始值在枚举声明中必须是唯一的。
- 对于一个特定的枚举成员,它的原始值始终不变。关联值是创建一个基于枚举成员的常量或变量时才设置的值,枚举成员的关联值可以变化。
隐式赋值
- 当使用整数作为原始值时,隐式赋值的值依次递增
1
。如果第一个枚举成员没有设置原始值,其原始值将为0
。
- 当使用字符串作为枚举类型的原始值时,每个枚举成员的隐式原始值为该枚举成员的名称。
原始值构造器
如果在定义枚举类型时使用了原始值,那么将会自动获得一个初始化方法,这个方法接收一个叫做
rawValue
的参数,参数类型即为原始值类型,返回值则是枚举成员或 nil
。递归枚举
递归枚举是一种枚举类型,它有一个或多个枚举成员使用该枚举类型的实例作为关联值。使用递归枚举时,编译器会插入一个间接层。你可以在枚举成员前加上
indirect
来表示该成员可递归。当所有成员都是可递归时,可以在枚举类型开头加上
indirect
关键字。枚举值内存计算
原始值内存计算
枚举中所有原始值占用内存为1字节,因为原始值的具体值并没有存在内存中,枚举中只存储了序号,序号占用内存为1字节。
关联值内存计算
- 关联值直接存储在枚举中,因此占用内存需要加上成员的数据类型的大小。
- 枚举中关联值占用的内存大小是数据类型的大小加上关联关联值的序号(一个字节)。
upc
占用8+8+8+8+1
字节内存,qrCode
占用8字节内存,按最大的算,所以实际占用内存为33字节。
- 分配空间大小是8字节对齐,因此分配内存需要40个字节。
- 作者:黄x黄
- 链接:https://hxhowl.site/article/swift013
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。
相关文章