内容简介:鉴于昨天开会部门会议讨论的时候,发现有些朋友对枚举的用法还是存在一些疑问,所以就写下这个文章,介绍下Swift下的枚举的用法。 ###基本的枚举类型 来,二话不说,我们先贴一个最基本的枚举:这里就定义了一个简单的方向枚举,有上下左右四个方面的case。那么我们可以做些什么操作呢? 1、你可以遍历他的枚举:2、你可以对场景进行比较:
鉴于昨天开会部门会议讨论的时候,发现有些朋友对枚举的用法还是存在一些疑问,所以就写下这个文章,介绍下Swift下的枚举的用法。 ###基本的枚举类型 来,二话不说,我们先贴一个最基本的枚举:
enum Movement { case letf case right case top case bottom } 复制代码
这里就定义了一个简单的方向枚举,有上下左右四个方面的case。那么我们可以做些什么操作呢? 1、你可以遍历他的枚举:
let aMovement = Movement.left switch aMovement { case .left: print("Left") default:() } 复制代码
2、你可以对场景进行比较:
if aMovement == .left { print("Left") } 复制代码
###枚举值 与OC不一样,Swift的枚举牛逼得多了,OC只能玩Int,他能玩:
- 整型(Integer)
- 浮点数(Float Point)
- 字符串(String)
- 布尔类型(Boolean)
enum Movement:Int { case left = 0 case right = 1 case top = 2 case bottom = 3 } enum Area: String { case DG = "dongguan" case GZ = "guangzhou" case SZ = "shenzhen" } 复制代码
不过,你要是想玩个自定义的类关联类型,那还是不行的,不过,已经够用了。如果你想要或者枚举的case对应的值,只需要 print(Area.DG.rawValue)
这样调用就可以了,直接调用对应的 rawValue
。不过有一点要注意哈,你如果用 rawValue
来构造一个枚举对象,他是有可能不在任何一个场景的,因为,他的返回值是可选的。
###嵌套枚举
enum Area { enum DongGuan { case NanCheng case DongCheng } enum GuangZhou { case TianHe case CheBei } } print(Area.DongGuan.DongCheng) 复制代码
上代码,一目了然,怎么调,直接看,哈哈~~~
###关联值 这个关联值的说法就比较学术了,其实很简单,我们平时也经常用:
enum Trade { case Buy(stock:String,amount:Int) case Sell(stock:String,amount:Int) } let trade = Trade.Buy(stock: "003100", amount: 100) switch trade { case .Buy(let stock,let amount): print("stock:\(stock),amount:\(amount)") case .Sell(let stock,let amount): print("stock:\(stock),amount:\(amount)") default: () } 复制代码
你看,其实就是枚举的case可以传值,不要小看这功能,放在OC里面,要写这样的代码,麻烦了去了。
###方法和属性 先上代码:
enum Device { case iPad, iPhone, AppleTV, AppleWatch func introduced() -> String { switch self { case .iPad: return "iPad" case .iPhone: return "iPhone" case .AppleWatch: return "AppleWatch" case .AppleTV: return "AppleTV" } } } print(Device.iPhone.introduced()) 复制代码
很清晰,我们定义了一个设备枚举,有iPad, iPhone, AppleTV, AppleWatch,还有一个介绍的方法。这里的 introduced
方法,你可以认为枚举是一个类, introduced
是一个成员方法,Device.iPhone就是一个Device的实例,case们是他的属性,好了,有了这个对像,Device.iPhone可以认为,Device里面有一个匿名属性,现在设置这个属性为iPhone。好了,introduced里面的 switch self
,其实就是遍历这个匿名属性的所有场景,如iPad,iPhone等,然后根据不同的场景返回不同的值。
###属性 增加一个存储属性到枚举中不被允许,但你依然能够创建计算属性。当然,计算属性的内容都是建立在枚举值下或者枚举关联值得到的。
enum Device { case iPad, iPhone var year: Int { switch self { case iPhone: return 2007 case iPad: return 2010 } } } 复制代码
###静态方法
enum Device { case iPad, iPhone, AppleTV, AppleWatch func introduced() -> String { switch self { case .iPad: return "iPad" case .iPhone: return "iPhone" case .AppleWatch: return "AppleWatch" case .AppleTV: return "AppleTV" } } static func fromSlang(term: String) -> Device? { if term == "iWatch" { return .AppleWatch } return nil } } print(Device.fromSlang(term: "iWatch")) 复制代码
static func fromSlang(term: String) -> Device?
就是一个静态方法。
###协议 Swift也允许你在枚举中使用协议(Protocols)和协议扩展(Protocol Extension)。 Swift协议定义一个接口或类型以供其他数据结构来遵循。enum当然也不例外。我们先从Swift标准库中的一个例子开始. CustomStringConvertible是一个以打印为目的的自定义格式化输出的类型。
protocol CustomStringConvertible { var description: String { get } } 复制代码
该协议只有一个要求,即一个只读(getter)类型的字符串(String类型)。我们可以很容易为enum实现这个协议。
enum Trade :CustomStringConvertible{ case Buy(stock:String,amount:Int) case Sell(stock:String,amount:Int) var description: String { switch self { case .Buy(_, _): return "Buy" case .Sell(_, _): return "Sell" } } } print(Trade.Buy(stock: "003100", amount: 100).description) 复制代码
###扩展 枚举也可以进行扩展。最明显的用例就是将枚举的case和method分离,这样阅读你的代码能够简单快速地消化掉enum内容,紧接着转移到方法定义:
enum Device { case iPad, iPhone, AppleTV, AppleWatch } extension Device: CustomStringConvertible{ func introduced() -> String { switch self { case .iPad: return "iPad" case .iPhone: return "iPhone" case .AppleWatch: return "AppleWatch" case .AppleTV: return "AppleTV" } } var description: String { switch self { case .iPad: return "iPad" case .iPhone: return "iPhone" case .AppleWatch: return "AppleWatch" case .AppleTV: return "AppleTV" } } } print(Device.AppleTV.description) print(Device.iPhone.introduced()) 复制代码
###泛型
enum Rubbish<T> { case price(T) func getPrice() -> T { switch self { case .price(let value): return value } } } print(Rubbish<Int>.price(100).getPrice()) 复制代码
好了,基本上就这些吧,有要补充的话,求回复~~~~~
以上所述就是小编给大家介绍的《Swift枚举的全用法》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- TypeScript 枚举类型用法示例
- Swift 枚举的几个小用法
- c# – 枚举时项目发生变化时是否会影响枚举?
- 测者的测试技术手册:Junit单元测试遇见的一个枚举类型的坑(枚举类型详解)
- 测者的JUnit单元测试探坑记:Junit单元测试遇见的一个枚举类型的坑(枚举类型详解)
- c# – 循环枚举类型
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Beautiful Code
Greg Wilson、Andy Oram / O'Reilly Media / 2007-7-6 / GBP 35.99
In this unique work, leading computer scientists discuss how they found unusual, carefully designed solutions to difficult problems. This book lets the reader look over the shoulder of major coding an......一起来看看 《Beautiful Code》 这本书的介绍吧!