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

相关文章

C++11作用域枚举(Scoped Enums)的实现示例

《C++11作用域枚举(ScopedEnums)的实现示例》枚举类型是一种非常实用的工具,C++11标准引入了作用域枚举,也称为强类型枚举,本文主要介绍了C++11作用域枚举(ScopedEnums... 目录一、引言二、传统枚举类型的局限性2.1 命名空间污染2.2 整型提升问题2.3 类型转换问题三、C

Java 枚举的基本使用方法及实际使用场景

《Java枚举的基本使用方法及实际使用场景》枚举是Java中一种特殊的类,用于定义一组固定的常量,枚举类型提供了更好的类型安全性和可读性,适用于需要定义一组有限且固定的值的场景,本文给大家介绍Jav... 目录一、什么是枚举?二、枚举的基本使用方法定义枚举三、实际使用场景代替常量状态机四、更多用法1.实现接

C 语言中enum枚举的定义和使用小结

《C语言中enum枚举的定义和使用小结》在C语言里,enum(枚举)是一种用户自定义的数据类型,它能够让你创建一组具名的整数常量,下面我会从定义、使用、特性等方面详细介绍enum,感兴趣的朋友一起看... 目录1、引言2、基本定义3、定义枚举变量4、自定义枚举常量的值5、枚举与switch语句结合使用6、枚

Java枚举类实现Key-Value映射的多种实现方式

《Java枚举类实现Key-Value映射的多种实现方式》在Java开发中,枚举(Enum)是一种特殊的类,本文将详细介绍Java枚举类实现key-value映射的多种方式,有需要的小伙伴可以根据需要... 目录前言一、基础实现方式1.1 为枚举添加属性和构造方法二、http://www.cppcns.co

C#实现获得某个枚举的所有名称

《C#实现获得某个枚举的所有名称》这篇文章主要为大家详细介绍了C#如何实现获得某个枚举的所有名称,文中的示例代码讲解详细,具有一定的借鉴价值,有需要的小伙伴可以参考一下... C#中获得某个枚举的所有名称using System;using System.Collections.Generic;usi

Java 枚举的常用技巧汇总

《Java枚举的常用技巧汇总》在Java中,枚举类型是一种特殊的数据类型,允许定义一组固定的常量,默认情况下,toString方法返回枚举常量的名称,本文提供了一个完整的代码示例,展示了如何在Jav... 目录一、枚举的基本概念1. 什么是枚举?2. 基本枚举示例3. 枚举的优势二、枚举的高级用法1. 枚举

Rust中的Option枚举快速入门教程

《Rust中的Option枚举快速入门教程》Rust中的Option枚举用于表示可能不存在的值,提供了多种方法来处理这些值,避免了空指针异常,文章介绍了Option的定义、常见方法、使用场景以及注意事... 目录引言Option介绍Option的常见方法Option使用场景场景一:函数返回可能不存在的值场景

hdu 2489 (dfs枚举 + prim)

题意: 对于一棵顶点和边都有权值的树,使用下面的等式来计算Ratio 给定一个n 个顶点的完全图及它所有顶点和边的权值,找到一个该图含有m 个顶点的子图,并且让这个子图的Ratio 值在所有m 个顶点的树中最小。 解析: 因为数据量不大,先用dfs枚举搭配出m个子节点,算出点和,然后套个prim算出边和,每次比较大小即可。 dfs没有写好,A的老泪纵横。 错在把index在d

hdu 6198 dfs枚举找规律+矩阵乘法

number number number Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Problem Description We define a sequence  F : ⋅   F0=0,F1=1 ; ⋅   Fn=Fn

【Rust练习】12.枚举

练习题来自:https://practice-zh.course.rs/compound-types/enum.html 1 // 修复错误enum Number {Zero,One,Two,}enum Number1 {Zero = 0,One,Two,}// C语言风格的枚举定义enum Number2 {Zero = 0.0,One = 1.0,Two = 2.0,}fn m