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 north
    case south
    case east
    case 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 none
    case 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 = 2
    case two = 345
    // 静态变量
    static  var storedTypeProperty = "Some value."
    // 静态计算属性
    static var computedTypeProperty: Int {
        return 6
    }
    // 计算属性
    var getRaw:Int{
        return self.rawValue
    }
}
  • 一般人都不知道的神级操作
enum Locale {
    case none
    case base
    case 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 none
    case base
    case 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)
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,362评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,330评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,247评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,560评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,580评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,569评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,929评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,587评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,840评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,596评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,678评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,366评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,945评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,929评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,165评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,271评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,403评论 2 342

推荐阅读更多精彩内容

  • 枚举 在 C 语言中,枚举会为一组整型值分配相关联的名称。Swift 中的枚举更加灵活,不必给每一个枚举成员提供一...
    蛊毒_阅读 334评论 0 1
  • 枚举是啥我就不多说了。Swift中的枚举更灵活,并且不必给每个枚举成员赋值。如果给枚举成员赋值(称为『原始』值),...
    Mustard_Buli阅读 609评论 0 1
  • 用enum 来创建一个枚举。像类和其他的命名类型一样,枚举也可以有方法。 默认情况下,Swift 赋值给枚举的原始...
    民谣程序员阅读 373评论 0 1
  • 1.0-基础部分 pragma mark:输出常量和变量 你可以用print(_:separator:termin...
    037e3257fa3b阅读 893评论 2 7
  • 文/徐兀兀 我特别爱镇上那家牛肉面,鲜美的汤汁配上粗细均匀的面条,上面撒些葱花,放下足料的牛肉,它不能外带,你们都...
    Even徐兀兀阅读 415评论 0 0