鉴于昨天开会部门会议讨论的时候,发现有些朋友对枚举的用法还是存在一些疑问,所以就写下这个文章,介绍下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来构造一个枚举对象,他是有可能不在任何一个场景的,因为,他的返回值是可选的。

image.png

嵌套枚举

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枚举的全用法的更多相关文章

  1. [Swift]枚举

    1. Swift的枚举的基本用法: 1) 和其它语言枚举的意义相同,就是用有限的一组值(不能是无限的)来表示一些特定的含义: 2) Swift使用关键字enum定义枚举类型,定义体中用case定义成员 ...

  2. Java SE 枚举的基本用法

    出于对自己基础的稳打,期末考试后依旧对SE部分进行复习 枚举的基本用法 public enum Season { SPRING,SUMMER,AUTUMN,WINTER } public class ...

  3. OpenJDK源码研究笔记(十):枚举的高级用法,枚举实现接口,竟是别有洞天

    在研究OpenJDK,Java编译器javac源码的过程中,发现以下代码. 顿时发现枚举类竟然也有如此"高端大气上档次"的用法. 沙场点兵(用法源码) com.sun.tools. ...

  4. Java中枚举的常见用法

    在JDK1.5以后引入了一种新的类型,就是枚举(enum).enum是用来声明枚举类型数据,它可以像数组一样存储许多的元素,但是不同于数组的是,它除了数字不能存储以外, 其他类型的如字母.特殊符号.汉 ...

  5. 5.Swift枚举|结构体|类|属性|方法|下标脚本|继承

    1. 枚举: ->在Swift中依然适用整数来标示枚举值,需搭配case关键字 enum  Celebrity{  case DongXie,XiDu,Nandi,BeiGai }  // 从左 ...

  6. C#中的枚举类型enum用法

    定义一个简单的枚举类型:   enum Days {Sat, Sun, Mon, Tue, Wed, Thu, Fri};        //这时候         Days.Sat = 0 ,后面依 ...

  7. swift 枚举类型

    1:swift的枚举类型是一系列的值,不同于c语言中枚举类型是整数类型.每个枚举定义了个新的类型 2:switch类型匹配 2.1枚举类型和switch单个匹配 enum PlatType{ case ...

  8. Swift枚举|结构体|类|属性|方法|下标脚本|继承

    1. 枚举: ->在Swift中依然适用整数来标示枚举值,需搭配case关键字 enum  Celebrity{  case DongXie,XiDu,Nandi,BeiGai }  // 从左 ...

  9. enum枚举类型 的用法

    1.作为数组下标使用 enun  box{pencil, ruler}; void main() { string s[2]; s[pencil]="pencil"; s[rule ...

随机推荐

  1. NamedPipeStream的使用

    NamedPipeStream的使用具体案例如下: using System; using System.Data; using System.Data.SQLite; using System.IO ...

  2. ls列出排除的文件

    今天有个需求,将从日志文件夹中列出它排除旧备份日志的文件. ls -lhrt --ignore="*.gz" --ignore="*.zip"

  3. 文件数据库sqlite3 C++ 线程安全和并发

    转载:https://www.cnblogs.com/feng9exe/p/10682567.html(线程安全和并发) 转载:https://juejin.im/post/5b7d8522e51d4 ...

  4. 安装比特币区块链钱包API(Blockchain Wallet用户发送和接收比特币的简单API)

    区块链钱包API提供了一个简单的界面,商家可以用它以编程方式与钱包进行交互. 安装:要使用此API,您需要运行负责管理区块链钱包的小型本地服务. 您的应用程序通过HTTP API调用在本地与此服务进行 ...

  5. [转]白话HTTP短连接中的Session和Token

    我经常想象并怀念三十年前那原始而美好的互联网旧时光, 工作很轻松, 生活很悠闲. 上班的时候偶尔有些HTTP的请求发到我这里, 我简单的看一下, 取出相对应的html文档,图片,发回去就可以了, 然后 ...

  6. shell关闭指定进程

    例如要关闭jupyter-notebook这个进程: ps -ef | grep jupyter-notebook | grep -v grep | cut -c 9-15 | xargs kill ...

  7. 企业微信域名IP列表

    https://res.mail.qq.com/zh_CN/wework_ip/latest.html?st=C98F886B96A94AD2207D9F0B2970B93DFD5A76DF94CED ...

  8. win10 mount error 112 : host is down解决方案

    摘自:https://www.baidu.com/link?url=xZrOVRqR9gqGRq0esfVaivByR9E5-ixyAuKsQ_8Hiedl1sY6J7ezBlgSW3oe_X-koo ...

  9. Android 调试桥介绍 (adb)

    Android 调试桥 adb ( Android Debug Bridge)是一个通用命令行工具,其允许您与模拟器实例或连接的 Android 设备进行通信.它可为各种设备操作提供便利,如安装和调试 ...

  10. [LeetCode] 857. Minimum Cost to Hire K Workers 雇K个工人的最小花费

    There are N workers.  The i-th worker has a quality[i] and a minimum wage expectation wage[i]. Now w ...