惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
爱范儿
爱范儿
H
Help Net Security
Last Week in AI
Last Week in AI
The Cloudflare Blog
博客园 - 三生石上(FineUI控件)
小众软件
小众软件
IT之家
IT之家
aimingoo的专栏
aimingoo的专栏
大猫的无限游戏
大猫的无限游戏
Jina AI
Jina AI
Google DeepMind News
Google DeepMind News
B
Blog
C
Check Point Blog
T
Tailwind CSS Blog
云风的 BLOG
云风的 BLOG
D
Docker
Recent Announcements
Recent Announcements
Vercel News
Vercel News
博客园 - 聂微东
阮一峰的网络日志
阮一峰的网络日志
MyScale Blog
MyScale Blog
The GitHub Blog
The GitHub Blog
Stack Overflow Blog
Stack Overflow Blog
雷峰网
雷峰网
人人都是产品经理
人人都是产品经理
月光博客
月光博客
F
Fortinet All Blogs
Blog — PlanetScale
Blog — PlanetScale
B
Blog RSS Feed
The Register - Security
The Register - Security
V
Visual Studio Blog
F
Full Disclosure
Hugging Face - Blog
Hugging Face - Blog
T
Threat Research - Cisco Blogs
Latest news
Latest news
PCI Perspectives
PCI Perspectives
Cisco Talos Blog
Cisco Talos Blog
博客园 - Franky
D
DataBreaches.Net
A
Arctic Wolf
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
G
Google Developers Blog
P
Palo Alto Networks Blog
Engineering at Meta
Engineering at Meta
Microsoft Azure Blog
Microsoft Azure Blog
T
Tenable Blog
L
LINUX DO - 热门话题
Spread Privacy
Spread Privacy

博客园 - 幻化成疯

今天又是一年的最后一个工作日 今天是最后一个工作日 过年了,龙年 新年又来了!今天是放假的最后前的最后一个工作日! Vue开发时运行npm install命令导致npm包自动升级而引起bug iOS AppIcon透明圆角导致的动画问题 iOS14 毛皮玻璃Blur效果英文教程推荐 iOS14 SceneKit Camera 的视角 iOS14 Core Location后台定位 用.Net 开发Windows Service ,合并dll到exe中 iOS SpriteKit 字体设置无效问题 2021又来到了! Dart 和 Javascript 中的await 和 async的理解 iOS12 判断网络链接状态NWPathMonitor 又离职了~ 留个纪念,过了这么多年,又干回Android了! mac上运行shell脚本遇到回车字符错误 - 幻化成疯 - 博客园 iOS12 中的后台下载与上传 以iphone作为热点时ios程序中的UDP广播地址
Swift5 的 Enum
幻化成疯 · 2021-03-16 · via 博客园 - 幻化成疯

c语言中的enum仅仅能代表一个整型,swift对其进行了巨大地拓展。

简介

eunm 在swift中是 first-class types,能定义一个类型。比如:

enum ErrorCode{
    case code1
    case code2
}
var test = ErrorCode.code1

这里test就是一个ErrorCode类型,具体的值是code1. 既然test是ErrorCode类型,自然可以使用
test = ErrorCode.code2 对 test进行的值进行更改。打个不恰当的比方,如果把ErrorCode看作一个类,那么code1和 code2 就像已经创建好的实例变量,test变量就像一个深拷贝。

Associated Values

为了应对更加复杂的情况,swift增加了 Associated Values 的概念。Associated Values能够为一个case关联一个值,值的类型是任意的,而且每一个case的关联值的类型不需要统一。比如:

enum Barcode {
 case upc(Int, Int, Int, Int)
 case qrCode(String)
}

这里upc关联了一个(Int, Int, Int, Int), 而qrCode 关联的是String。

case的Associated Values 必须动态指定

Associated values are set when you create a new constant or variable based on one of the enumeration’s cases, and can be different each time you do so.

比如:


productBarcode = .qrCode("ABCDEFGHIJKLMNOP")

如果想使用case里的Associated Values,必须使用switch case 语句:



switch productBarcode {

case .upc(let numberSystem, let manufacturer, let product, let check):

    print("UPC: \(numberSystem), \(manufacturer), \(product), \(check).")

case .qrCode(let productCode):

    print("QR code: \(productCode).")

}

rawValue

Raw value是 一种 特殊的Associated Values ,使用起来简单,适用于通常的enum场景。一个enum只能有一个Raw value类型,每个case的 rawValue都有 default 值,不必写代码动态指定。对于Int和String类型的rawValue,可以不把每个case都指定默认值,系统可以进行推算。从case值里面取rawValue也十分简单,不必再放入switch case 语句中。

Raw values can be strings, characters, or any of the integer or floating-point number types. Each raw value must be unique within its enumeration declaration.

比如:

enum Planet: Int {
    case mercury = 1, venus, earth, mars, jupiter, saturn, uranus, neptune
}

注意,这个Int不能省略,否则系统不认为这个enum使用 raw Value 。

并且,系统会提供一个初始化方法,比如:

enum Planet: Int {
    case mercury = 1, venus, earth, mars, jupiter, saturn, uranus, neptune
}
let possiblePlanet = Planet(rawValue: 7)

这个possblePlanet 是一个Optional类型,如果rawValue的输入参数对应的值不存在,possiblePlanet就会是nil。从这一点也能看出,系统必须限制rawValue的类型,因为需要判断rawValue是否和预定义值相等。

rawValue 和 Associated value 的区别在于:

Raw values are not the same as associated values. Raw values are set to prepopulated values when you first define the enumeration in your code, like the three ASCII codes above. The raw value for a particular enumeration case is always the same. Associated values are set when you create a new constant or variable based on one of the enumeration’s cases, and can be different each time you do so.