版本记录
版本号 | 时间 |
---|---|
V1.0 | 2017.07.28 |
前言
我是swift2.0的时候开始接触的,记得那时候还不是很稳定,公司的项目也都是用oc做的,并不对swift很重视,我自己学了一段时间,到现在swift3.0+已经出来了,自己平时也不写,忘记的也差不多了,正好项目这段时间已经上线了,不是很忙,我就可以每天总结一点了,希望对自己对大家有所帮助。在总结的时候我会对比oc进行说明,有代码的我会给出相关比对代码。
1. swift简单总结(一)—— 数据简单值和类型转换
2. swift简单总结(二)—— 简单值和控制流
3. swift简单总结(三)—— 循环控制和函数
4. swift简单总结(四)—— 函数和类
5. swift简单总结(五)—— 枚举和结构体
6. swift简单总结(六)—— 协议扩展与泛型
7. swift简单总结(七)—— 数据类型
8. swift简单总结(八)—— 别名、布尔值与元组
9. swift简单总结(九)—— 可选值和断言
10. swift简单总结(十)—— 运算符
11. swift简单总结(十一)—— 字符串和字符
12. swift简单总结(十二)—— 集合类型之数组
13. swift简单总结(十三)—— 集合类型之字典
14. swift简单总结(十四)—— 控制流
15. swift简单总结(十五)—— 控制转移语句
16. swift简单总结(十六)—— 函数
17. swift简单总结(十七)—— 闭包(Closures)
枚举
不知道大家是否还记得在OC
中枚举必须是整型,但是在swift
中对这方面进行了优化,突破了这方面的限制。swift
中不必给每一个枚举成员提供一个值,如果一个值被提供给每个枚举成员,则该值可以是一个字符串,一个字符,或者是一个整型值或者浮点值。
还要说明的是,在swift
中枚举类型是一等类型(first - class)
,它们采用了很多传统上只被类(class)
所支持的特征。比如:
- 计算型属性
(computed properties)
,用于提供关于枚举当前值的附加信息。 - 实例方法
(instance methods)
,用于提供和枚举所代表的值相关联的功能。 - 枚举也可以定义构造函数
(initializers)
来提供一个初始成员值。 - 可以在原始的实现基础上扩展它们的功能。
- 可以遵守协议
(protocols)
来提供标准功能。
下面从以下四个方面进行讲解:
- 枚举语法
(Enumeration Syntax)
- 匹配枚举值与switch语句
(Matching Enumeration Values with a Switch Statement)
- 相关值
(Associated Values)
- 原始值
(Raw Values)
枚举语法
下面我们看一个例子。
enum ComposePoint {
case North
case South
case East
case West
}
这里要注意:OC
中可以给第一个成员赋初始值,然后下面的成员就会顺着一次加1,但是swift
中并不会这么做,这些枚举成员在ComposePoint
的显示定义中拥有各自不同的值。
这些成员值还可以写在同一行上,用逗号隔开。
enum ComposePoint {
case North, South, East, West
}
再次与OC
相比,可见swift
更加灵活多变,功能强大。
将枚举值赋值给变量或者常量时,可以按照下例进行。
class JJSwiftVC: UIViewController
{
override func viewDidLoad()
{
super.viewDidLoad()
view.backgroundColor = UIColor.lightGray
//枚举赋值情况
var direction = ComposePoint.North
direction = .West
}
}
匹配枚举值与switch语句
枚举值可以和switch
语句结合起来使用,看下面这个例子。
class JJSwiftVC: UIViewController
{
override func viewDidLoad()
{
super.viewDidLoad()
view.backgroundColor = UIColor.lightGray
//枚举赋值情况
var direction = ComposePoint.North
direction = .West
switch direction {
case .North:
print("North")
case .South:
print("South")
case .West:
print("West")
case .East:
print("East")
}
}
}
下面看输出结果
West
相关值
如果有时候能够把其他类型的相关值和成员值一起存储起来会很有用,这能让你存储成员值之外的自定义信息,并且当你每次在代码中使用该成员时允许这个信息产生变化。swift
的枚举可以存储任意类型的相关值,如果需要的话,每个成员的数据类型可以都是各不相同的,枚举的这种特性和其他语言中的辨识联合discriminated unions
,标签联合tagged unions
,变体variants
类似。
看下面这个例子。
enum Barcode {
case UPCA(Int, Int, Int)
case QRCode(String)
}
class JJSwiftVC: UIViewController
{
override func viewDidLoad()
{
super.viewDidLoad()
view.backgroundColor = UIColor.lightGray
var productBarCode = Barcode.UPCA(8, 85909_51226, 3)
productBarCode = .QRCode("ABCDSFRGHJ")
switch productBarCode {
case .UPCA(let numberSystem, let identify, let check):
print("UPC-A with value of \(numberSystem), \(identify), \(check)")
case .QRCode(let productCode):
print("QR code with value of \(productCode)")
}
}
}
下面看输出结果
QR code with value of ABCDSFRGHJ
如上,不同的条形码类型可以使用一个switch
语句检查,然而这次相关值可以被提取坐位switch
语句的一部分,你可以在switch
的case
分支代码中提取每个相关值作为一个常量或者作为一个变量来使用。
如果一个枚举成员的所有相关值被提去为常量,或者它们全部被提取为变量,为了简洁,你可以只放置一个var
或者let
标注在成员名称前。具体代码如下:
switch productBarCode {
case let .UPCA( numberSystem, identify, check):
print("UPC-A with value of \(numberSystem), \(identify), \(check)")
case let .QRCode( productCode):
print("QR code with value of \(productCode)")
}
下面看输出结果
QR code with value of ABCDSFRGHJ
这里只是更改了代码组织结构,并没有改变最后的值,这里注意,只有同一个分支里面所有数据相关值类型一样时,数据类型才可以提到最前面。
原始值
在讲述相关值的时候,一个枚举成员可以存储不同类型的相关值,作为相关值的替代,枚举成员可以被默认值(称为原始值)预先填充,其中这些原始值具有相同的类型。
下面看个简单例子。
enum ASCIICharacter : Character {
case Tab = "\t"
case LineFeed = "\n"
case CarriageReturn = "\r"
}
这里,ASCIICharacter
的枚举的原始值类型被定义为Character
。
注意:原始值和相关值是不相同的,当你开始在你的代码中定义枚举的时候原始值是被预先填充的值,像上述三个ASCII值,对于一个特定的枚举成员,它的原始值始终是相同的,相关值是当你在创建一个基于枚举成员的新常量或者变量时才会被设置,并且每次当你这么做的时候,它的值可以是不同的。
原始值的类型可以是字符串,字符,或者任何整型值或浮点型值,每个原始值在它的枚举声明中必须是唯一的,当整型值被用于原始值,如果其他枚举成员没有值时,它们会自动递增,最后这一点和OC
是一样的。
可以通过枚举成员的属性rawValue
获取原始值。
下面看这个简单例子。
enum Planet : Int {
case Mercury = 1, Venus, Earth, Mars, Jupiter, Saturn, Uranus, Neptune
}
class JJSwiftVC: UIViewController
{
override func viewDidLoad()
{
super.viewDidLoad()
view.backgroundColor = UIColor.lightGray
let earthOrder = Planet.Earth.rawValue
print(earthOrder)
}
}
下面看输出结果
3
还可以通过参数为rawValue
构造函数创建特定原始值的枚举,下面看这个例子。
class JJSwiftVC: UIViewController
{
override func viewDidLoad()
{
super.viewDidLoad()
view.backgroundColor = UIColor.lightGray
let possiblePlanet = Planet(rawValue: 7)
print(possiblePlanet)
}
}
下面看输出结果
Optional(JJSwift.Planet.Uranus)
大家可以看见,这个值的类型是可选的,也就是说这个值可能存在也可能不存在,下面我们看一下不存在的例子。
enum Planet : Int {
case Mercury = 1, Venus, Earth, Mars, Jupiter, Saturn, Uranus, Neptune
}
class JJSwiftVC: UIViewController
{
override func viewDidLoad()
{
super.viewDidLoad()
view.backgroundColor = UIColor.lightGray
let possibleValue = 9
if let somePlanet = Planet(rawValue: possibleValue) {
switch somePlanet {
case .Earth:
print("Human Home")
default:
print("NO Humans")
}
}
else {
print("There is not a planet at position \(possibleValue)")
}
}
}
下面看输出结果
There is not a planet at position 9
后记
未完,待续~~~