随着swift语言的不断发展,越来越来趋于稳定化。现在也有很多公司使用swift来开发新的App,那么不会swift开发的iOS开发者在竞争中还是很弱势的,所有学习swift是大势所趋。本系列文章根据以往的学习积累和项目经验,从基础到原理详细说说swift的这点事儿,不喜勿喷,交流指正请加微信。

一. 枚举的基本用法
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 如果已知枚举的类型,Direction可以省略
枚举用switch进行判断
switch dir {
case .north:
print("north")
case .south:
print("south")
case .east:
print("east")
case .west:
print("west")
}
二. 关联值
有时将枚举的成员值跟其他类型的值关联存储在一起,会非常有用
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)
}
// grade A
枚举的成员值跟其他类型的值关联存储在一起,应用举例。
如果你有一个时间显示控件,可以显示年月日,就是xxxx-xx-xx这种样式,也可以显示自定义字符串类型,用下面的代码进行判断是不是更加的方便。
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
三. 原始值
枚举成员可以使用相同类型的默认值预先对应,这个默认值叫做:原始值
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
注意:原始值不占用枚举变量的内存
原始值的应用举例
Alamofire swift版AFN

四. 隐式原始值
如果枚举的原始值类型是Int、String,Swift会自动分配原始值
下面的两段代码效果一样
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
我们指定了 Direction 是字符串类型,系统会默认生成原始值,所以上面的两段代码效果一样
enum Season : Int {
case spring, summer, autumn, winter
}
print(Season.spring.rawValue) // 0
print(Season.summer.rawValue) // 1
print(Season.autumn.rawValue) // 2
print(Season.winter.rawValue) // 3
// 等价于
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
我们指定了 Season 是Int类型,系统会默认生成原始值,系统会从0开始,如果第一个赋值的不是0,中间的会按照顺序生成
五. 递归枚举
递归枚举是拥有另一个枚举作为枚举成员关联值的枚举,实际上就是Swift中枚举关联值的特性和递归算法在Swift开发中的运用。
定义递归枚举时,需要使用indirect关键字明确枚举成员它是可以递归的。
enum ArithmeticExpression {
case number(Int)
indirect case addition(ArithmeticExpression, ArithmeticExpression)
indirect case multiplication(ArithmeticExpression, ArithmeticExpression)
}
可以在枚举之前写indirect
来让整个枚举成员在需要时可以递归:
indirect enum ArithmeticExpression {
case number(Int)
case addition(ArithmeticExpression, ArithmeticExpression)
case multiplication(ArithmeticExpression, ArithmeticExpression)
}
举例说明:
以下代码使用ArithmeticExpression枚举类型定义枚举常量对数学表达式5、4、2、5 + 4、(5 + 4) * 2进行表示。
let five = ArithmeticExpression.number(5)
let four = ArithmeticExpression.number(4)
let sum = ArithmeticExpression.addition(five, four)
let product = ArithmeticExpression.multiplication(sum, ArithmeticExpression.number(2))
以下函数通过对上述枚举常量的判断从而求出对应的数学表达式的值。
func evaluate(_ expression: ArithmeticExpression) -> Int {
switch expression {
case let .number(value):
return value
case let .addition(left, right):
return evaluate(left) + evaluate(right)
case let .multiplication(left, right):
return evaluate(left) * evaluate(right)
}
}
print(evaluate(five)) // 打印 "5"
print(evaluate(four)) // 打印 "4"
print(evaluate(sum)) // 打印 "9"
print(evaluate(product)) // 打印 "18"
关于swift的更多知识
请点击 swift文集!
网友评论