本文主要是介绍Swift3.0 - 枚举,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
Swift3.0 - 真的很简单
Swift3.0 - 数据类型
Swift3.0 - Array
Swift3.0 - 字典
Swift3.0 - 可选值
Swift3.0 - 集合
Swift3.0 - 流控制
Swift3.0 - 对象和类
Swift3.0 - 属性
Swift3.0 - 函数和闭包
Swift3.0 - 初始化和释放
Swift3.0 - 协议protocol
Swift3.0 - 类和结构体的区别
Swift3.0 - 枚举
Swift3.0 - 扩展
Swift3.0 - 下标
Swift3.0 - 泛型
Swift3.0 - 异常错误
Swift3.0 - 断言
Swift3.0 - 自动引用计数(strong,weak,unowned)
Swift3.0 - 检测API
Swift3.0 - 对象的标识
Swift3.0 - 注释
Swift3.0 - 元类型
Swift3.0 - 空间命名
Swift3.0 - 对象判等
Swift3.0 - 探究Self的用途
Swift3.0 - 类簇
Swift3.0 - 动态调用对象(实例)方法
Swift3.0 - 文本输出
Swift3.0 - 黑魔法swizzle
Swift3.0 - 镜像
Swift3.0 - 遇到的坑
基本用法
- 最简单的定义
a.多行写法
enum CompassPoint {case northcase southcase eastcase west}
b.单行写法
enum CompassPoint {case north,south,ease,west
}
提示:
Swift 3.0 开始,定义枚举值,统一小写
- 指定枚举类型的原始数据类型
enum Rank: Int{ // Int 设置枚举值的类型
// 定义枚举值设置值
case ace
// 可以case 后面一次定义多个枚举值
case two, three, four, five, six, seven, eight, nine, ten
case jack, queen, king// 定义函数 如果多人合作的时候,可以使用这个让别人更加了解你定义的属性的含义func simpleDescription() -> String {switch self { // self 就是这个枚举本身case .ace:return "ace1"case .jack:return "jack1"case .queen:return "queen1"case .king:return "king1"default:return String(self.rawValue)}}
}
注意
枚举类型可以Int String等基本类型的值,对象是不可以的,官方说必须是实现RawRepresentable 协议的类型才可以
- 使用
let ace = Rank.ace // 非可选值let rank = Rank(rawValue: 1)
提示
第二种创建的枚举为可选类型,这样设计的原因是,你有可能创建一个nil对象,处于安全考虑它也必须是可选值,使用的时候要解包
- 给枚举设置原始值
enum CompassPoint {case north = "1"case south = "2"case east = "3"case west = "4"
}
提示:
你认为上面这样定义是否是正确的,答案是否定的,因为系统不知道你枚举的原始值是什么类型的,这里系统没有进行类型推断,所有我们要给枚举添加原始值之前,必须指定枚举原始值的类型,如下
enum CompassPoint:Character{case north = "1"case south = "2"case east = "3"case west = "4"
}
- 获取原始值
let aceRawValue = ace.rawValue
提示
1.如果你没有定义枚举的原始值类型,你不能通过上述方法获取原始值
2.输入定义的是数字类型 ,原始值对应的是数字本身,
3.如果定义的是字符串类型,但你没有給它赋值,这个时候,你获取的原始值就是你定义的名字
高级用法
- 提供值创建枚举
enum ServerResponse {case result(String, String)case failure(String)
}
let success = ServerResponse.result("6:00 am", "8:09 pm")
let failure = ServerResponse.failure("Out of cheese.")
提示
这个方式定义的枚举 不能使用 == 来做判断处理,我们应该使用模式匹配的方式处理,这种定义方式强调的是传值,如下
switch success {
case let .result(sunrise, sunset): // 模式匹配print("Sunrise is at \\(sunrise) and sunset is at \\(sunset).")
case let .failure(message):print("Failure... \\(message)")
}// 或者
switch success {
case .result(let sunrise, let sunset): // 模式匹配print("Sunrise is at \\(sunrise) and sunset is at \\(sunset).")
case .failure(let message):print("Failure... \\(message)")
}
- indirect 使用方法
使用场景:
主要用于递归枚举,看下面例子,你应该很清楚怎么使用
a.使用方式1
enum ArithmeticExpression {
case number(Int)
indirect case addition(ArithmeticExpression, ArithmeticExpression)
indirect case multiplication(ArithmeticExpression, ArithmeticExpression)
}let expression = ArithmeticExpression.addition(ArithmeticExpression.number(3), ArithmeticExpression.number(4))
b.使用方式2
indirect enum ArithmeticExpression {case number(Int)case addition(ArithmeticExpression, ArithmeticExpression)case multiplication(ArithmeticExpression, ArithmeticExpression)
}let expression = ArithmeticExpression.addition(ArithmeticExpression.number(3), ArithmeticExpression.number(4))
结论:
如果你定义的枚举是递归的形式,必须有关键字indirect 修饰,不然系统会编译报错哦!
- 重新实现SWIFT标准库的可选类型(使用泛型技术)
enum OptionalValue<Wrapped> {case nonecase some(Wrapped)
}
var possibleInteger: OptionalValue<Int> = .none
possibleInteger = .some(100)
- 枚举可以继承协议
protocol Skill{mutating func modifyMusic(name:String)
}enum Type:String,Skill{
case name = "123"
mutating internal func modifyMusic(name: String) {self = Type(rawValue: "123")!
}
}
- 枚举不能包含存储属性,但是可以包含静态变量和计算属性
enum SomeEnumeration:Int {case one = 2case two = 345// 静态变量static var storedTypeProperty = "Some value."// 静态计算属性static var computedTypeProperty: Int {return 6}// 计算属性var getRaw:Int{return self.rawValue}
}
- 一般人都不知道的神级操作
enum Locale {case nonecase basecase language(String)}
我们创建一个变量
let locale = Locale.language("english")
问题: 我们怎么判断它是什么类型呢?
if locale == Locale.base {
}// 错误的判断方式
编译错误,如果没有 case language(String) 这种赋值枚举,可以使用上面的方式,一点问题也没有,但是如果有这种类型,系统不允许使用 == 进行数据判断的
我们可以提供下面的方式进行判断
switch locale{case Locale.base : print(locale)case Locale.none : print(locale)case Locale.language("english"): print(locale)case Locale.language(let x):print(x)
}
为了判断一个类型我们写这么一个判断是在是有点不雅,下面就体验一下关键字case 的神奇用法
我们重新写一下上面的枚举,使用case 写出优雅的代码
enum Locale {case nonecase basecase language(String)// 判断是否是汉语var isChinese:Bool{if case .language("chinese") = self {return true}return false}// 是否是其他语言var isLanguage:Bool{if case .language = self {return true}return false}var isBase: Bool {if case .base = self {return true}return false}var isNone: Bool {if case .none = self {return true}return false}
}
我们看一下如何调用
let locale = Locale.language("english")
print(locale.isChinese)
这篇关于Swift3.0 - 枚举的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!