Swift 枚举

Posted 卡卡西Sensei

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Swift 枚举相关的知识,希望对你有一定的参考价值。

目录

1.枚举的定义

2.枚举的使用

3.枚举的原始值

4.枚举值和原始值之间的转化:

5.枚举的关联值

6.枚举的属性

7.枚举中包含方法


1.枚举的定义

枚举在C/C++/c#中,是一个被命名的整型常数的集合, 枚举在日常生活中很常见。

例如表示星期的SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY,SATURDAY,就是一个枚举。

在 Swift 中,枚举类型是一等(first-class)类型。它们采用了很多在传统上只被类(class)所支持的特性,例如计算型属性(computed properties),用于提供枚举值的附加信息,实例方法(instance methods),用于提供和枚举值相关联的功能。枚举也可以定义构造函数(initializers)来提供一个初始值;可以在原始实现的基础上扩展它们的功能;还可以遵守协议(protocols)来提供标准的功能。

2.枚举的使用

使用enum关键词来创建枚举,并且把它们的整个定义放在一对大括号内

enum Direction {
	case North
	case South
	case East
	case West
}
//枚举也可以写成一行
enum Direction2 {
	case North,South,East,West
}

枚举中定义的值(如 North,South,East和West)是这个枚举的成员值(或成员)。使用case关键字来定义一个新的枚举成员值。

与 C 和 Objective-C 不同,Swift 的枚举成员在被创建时不会被赋予一个默认的整型值。North,South,East和West不会被隐式地赋值为0,1,2和3。相反,这些枚举成员本身就是完备的值,这些值的类型是已经明确定义好的Direction类型。多个成员值可以出现在同一行上,用逗号隔开。

//声明一个枚举

var a = Direction.North

var a2 = Direction.West

a2 = .South//.South = Direction.South,a2肯定是Direction类型的

//枚举也可以这样写,明确规定a3就是Direction类型

var a3:Direction = .East

可以使用switch语句匹配单个枚举值:

var d4 = Direction.North
switch d4 {
case .North:
	print("north")
case .South:
	print("South")
case .East:
	print("East")
default:
	print("default")
}

3.枚举的原始值

OC中枚举的本质就是整数,所以OC中的枚举是有原始值的,默认是从0开始,而Swift中的枚举默认是没有原始值的,但是可以在定义时告诉系统让枚举有原始值

//定义枚举类型为Int类型,默认从0开始,后面逐一加一(这就和C语言类似了)
enum Courses:Int {
	case math = 1,English,Chinese
}

除了Int类型,Swift枚举更加强大,还可以定义为Double、String等
但是如果指定除Int的其他类型,需要给所有枚举值赋值 


enum MathMethod: String {
    case Add = "add"
    case Sub = "sub"
    case Mul = "mul"
    case Div = "div"
}
enum Constants: Double {
    case π = 3.14159
    case e = 2.71828
    case φ = 1.61803398874
    case λ = 1.30357
}

4.枚举值和原始值之间的转化:

5.枚举的关联值

枚举的关联值是将额外信息,附加到枚举值中的一种方式。使用关联值,每一个枚举值就可以是在某种特定的情形下,关联特定的值。

比如在某超市,可能存在进货—“买”和售卖—“卖”两种不同的交易类型。除此之外每手交易还要制定明确的售卖商品名称和售卖的交易数量。

//定义一个交易枚举
enum Supermarket {
	 case Purchase(String, Int) //买,关联一个字符串和一个整形
	 case Sell(String, Int) //卖,关联一个字符串和一个整形
	 case SellGoods(String, Int, String) //每个枚举值的关联类型可以不一样
}

重新定义一个交易枚举,为关联值加上标签说明

enum Trade {
	 case Purchase(product: String, amount: Int) //买,商品名称和交易数量
	 case Sell(product: String, amount: Int) //卖,关联商品名称和交易数量
}

创建一个枚举,关联某些值

var tradeBuy = Trade.Purchase(product: "可乐", amount: 1100)

var tradeBuy2 = Trade.Purchase(product: "面包", amount: 230)

var tradeSell = Trade.Sell(product: "牛奶", amount: 1500)

提取值的方式

//第一种方式提取关联值,利用switch语句提取关联值
switch(tradeBuy){
	 case .Purchase(let product, let amount):
		  print("Buy \\(product) with \\(amount) number")
	 case let .Sell(product, amount)://简化
		  print("Sell \\(product) with \\(amount) number")
}
//第二种方式提取关联值,使用模式匹配提取关联值
if case let Trade.Sell(product, amount) = tradeSell {
	 print("Sell \\(amount) of \\(product)")
}

 

6.枚举的属性

尽管增加一个存储属性到枚举中不被允许,但你依然能够创建计算属性和类型属性。当然,计算属性的内容都是建立在枚举值下或者枚举关联值得到的。

enum Person {
	case birthday;
	case height;
	var age:Int {
			return 18;
	};
	static let weight = 65

}

不能包含存储属性 会报错:Enums must not contain stored properties

7.枚举中包含方法

  Swift中的枚举也可以包含方法,可以是实例方法也可以是静态方法

enum Person {
	case birthday;
	case height;
	var age:Int {
			return 18;
	};
	static let weight = 65

	func myName() -> Void {
		print("myName:zhangsan")
	}
	static func test() {
		print("test")
	}
}

let p = Person.height
let age = p.age
print("age:\\(age)")

p.myName()
Person.test()

 

以上是关于Swift 枚举的主要内容,如果未能解决你的问题,请参考以下文章

如何将这个 Objective-C 代码片段写入 Swift?

如何使用 Swift 使用此代码片段为 iOS 应用程序初始化 SDK?

如何从 swift 代码中获得有用的 objc 枚举打印输出?

Swift-2.8枚举

Swift:使用符合相同协议的嵌套枚举案例的代码较少

Swift新async/await并发中利用Task防止指定代码片段执行的数据竞争(Data Race)问题