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

推荐订阅源

酷 壳 – CoolShell
酷 壳 – CoolShell
H
Hacker News: Front Page
P
Palo Alto Networks Blog
T
ThreatConnect
Apple Machine Learning Research
Apple Machine Learning Research
博客园_首页
T
True Tiger Recordings
P
Privacy & Cybersecurity Law Blog
B
Blog
IT之家
IT之家
Last Week in AI
Last Week in AI
F
Full Disclosure
Hacker News: Ask HN
Hacker News: Ask HN
C
Comments on: Blog
Microsoft Azure Blog
Microsoft Azure Blog
C
Cybersecurity and Infrastructure Security Agency CISA
Microsoft Security Blog
Microsoft Security Blog
博客园 - 【当耐特】
N
News and Events Feed by Topic
NISL@THU
NISL@THU
腾讯CDC
雷峰网
雷峰网
Security Latest
Security Latest
李成银的技术随笔
M
Microsoft Research Blog - Microsoft Research
L
LangChain Blog
L
Lohrmann on Cybersecurity
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
C
Check Point Blog
Y
Y Combinator Blog
Recent Announcements
Recent Announcements
博客园 - Franky
N
News | PayPal Newsroom
V
V2EX
A
About on SuperTechFans
The Register - Security
The Register - Security
月光博客
月光博客
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Google Online Security Blog
Google Online Security Blog
MyScale Blog
MyScale Blog
Cisco Talos Blog
Cisco Talos Blog
Vercel News
Vercel News
WordPress大学
WordPress大学
C
Cyber Attacks, Cyber Crime and Cyber Security
The Hacker News
The Hacker News
IntelliJ IDEA : IntelliJ IDEA – the Leading IDE for Professional Development in Java and Kotlin | The JetBrains Blog
IntelliJ IDEA : IntelliJ IDEA – the Leading IDE for Professional Development in Java and Kotlin | The JetBrains Blog
爱范儿
爱范儿
A
Arctic Wolf
L
LINUX DO - 最新话题
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More

博客园 - 幻化成疯

今天又是一年的最后一个工作日 今天是最后一个工作日 过年了,龙年 新年又来了!今天是放假的最后前的最后一个工作日! 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.