Swift3.0 - 枚举

2024-06-11 01:32
文章标签 swift3.0 枚举

本文主要是介绍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 - 枚举的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1049837

相关文章

WDF驱动开发-WDF总线枚举(一)

支持在总线驱动程序中进行 PnP 和电源管理 某些设备永久插入系统,而其他设备可以在系统运行时插入和拔出电源。 总线驱动 必须识别并报告连接到其总线的设备,并且他们必须发现并报告系统中设备的到达和离开情况。 总线驱动程序标识和报告的设备称为总线的 子设备。 标识和报告子设备的过程称为 总线枚举。 在总线枚举期间,总线驱动程序会为其子 设备创建设备对象 。  总线驱动程序本质上是同时处理总线枚

IOS Swift 从入门到精通:数组,集合,元组,对比,字典,枚举

目录 数组 集合 元组 Arrays vs sets vs tuples 字典  字典默认值 创建空集合 枚举 枚举关联值 枚举原始值 复杂类型:总结 数组 数组是存储为单个值的值的集合。例如,John、Paul、George 和 Ringo 是姓名,但数组可让您将它们分组为单个值,即 The Beatles。 在代码中我们这样写: let john

java基础知识枚举提取公共类

引用地址:今日头条 如何规范化Enum在项目中的使用? 2022-03-02 14:14·老顾聊技术 前言 在我们平时开发过程中,枚举的使用时必不可少的。 为什么要用枚举? 有穷序列的字段用int或tinyint不是挺好吗? 答案很简单:我们的程序写给人看的。 既然是写给人看,那么,可理解、易理解往往显得相当重要! 枚举一般有两部分,一个是枚举项值,一个是枚举描述。那么,这两个

博弈论+递推+调和级数枚举,CF 1033C - Permutation Game

一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 1033C - Permutation Game 二、解题报告 1、思路分析 我们考虑一个位置符合什么条件可以必胜? 如果可以跳到一个必败的位置 考虑最大的格子一定是必败 而每个格子只能跳到比自己大的格子 于是我们就可以倒序处理状态 对于每个格子枚举比自己大

Android性能优化—不建议使用枚举Enum

最近优化App,由于项目中使用了Lib,而Lib代码中包含了大量的枚举类型,导致App占用内存过多发火。好吧,知道问题点,那就干掉,抛弃之~偷笑 问题是解决了,为啥会这样呢?疑问 先来看看Android官网的说明吧: 看见了吧,Android官网不建议咱们使用enums,说的也很清楚了,占用内存多(Enums often require more than twice as much memo

C# step by step 学习笔记8 CHAPTER 9 使用枚举和结构创建值类型

C# 2012 step by step 学习笔记8 CHAPTER 9 使用枚举和结构创建值类型 本章内容 声明一个枚举类型创建并使用一个枚举类型声明一个结构类型创建并使用一个结构类型解释结构和类之间行为的差别 声明一个枚举         enum Season { Spring, Summer, Fall, Winter } 使用枚举         You

C语言王国——深入自定义类型(联合体、枚举)

目录 一、引言 二、联合体 2.1 联合体类型的声明 2.2 联合体大小的计算 2.3 联合体的实践运用 2.4 用联合体测试大小端字节序 三、枚举 3.1 枚举类型的声明 3.2 枚举类型的特点 四、总结 一、引言 我们刚学完了结构体,相信大家对自定义类型也有了些许了解,但是自定义类型中还有两个我们尚未学习,它们也急不可耐的想展现在我们面前了,所以接下来就

2748. 美丽下标对的数目(Rust暴力枚举)

题目 给你一个下标从 0 开始的整数数组 nums 。如果下标对 i、j 满足 0 ≤ i < j < nums.length ,如果 nums[i] 的 第一个数字 和 nums[j] 的 最后一个数字 互质 ,则认为 nums[i] 和 nums[j] 是一组 美丽下标对 。 返回 nums 中 美丽下标对 的总数目。 对于两个整数 x 和 y ,如果不存在大于 1 的整数可以整除它们,

hibernate 自定义枚举类型映射

自定义类型MyEnumType package com.binarysource.hinernate;import java.io.Serializable;import java.lang.reflect.Field;import java.lang.reflect.Method;import java.sql.PreparedStatement;import java.sql.Re

Java enum枚举通过key动态获取value

public enum TestEnum {/*** 测试类型*/TEST_A("1", "测试A"),TEST_B("2", "测试B"),TEST_C("3", "测试C"),TEST_D("4", "测试D");private String type;private String name;TestEnum(String type, String name) {this.type = typ