| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 移动开发 -> Swift 与 OC 枚举的异同 -> 正文阅读 |
|
[移动开发]Swift 与 OC 枚举的异同 |
Swift 与 OC 枚举存在的不同问题与解决方案。 OC 中枚举的问题 在C、C++、Objective-C这类语言中,枚举实际上是整型的别名,仅具备整型的能力,由于类似的语言的类型系统很弱,以至于无法发现一些潜在的错误。
在使用的时候,通常会使用if或switch语句:
有时会出现这样的代码:
类型系统并不会发现问题,因为枚举就是整型,但是当枚举的定义发生变化时,这样的代码就变成了bug,而且很难排查。 此外,在逻辑上,完全可以写出 Swift 中的枚举 Swift中的枚举变成了一个独立的类型,这意味着,当我们在Swift中同样的定义:
这几个值并非0,1,2,3(当然也可以让他们恰好等于这些值)。 Swift为枚举提供了远超整型的能力,除了基本的if和switch模式匹配等基本用法之外,还可以:
这些特性官方文档都有详细的说明,这里就不展开了。 Swift中的枚举和OC枚举的相同之处就是名称一样,内涵和外延已经完全不同,其核心价值在于提供了在多种类型(而非仅仅整型)间做选择的机制,在将这种机制的实现细节与对外抽象分离的同时,赋予其上述所有的能力,这提供了更高的抽象层次和更强的表现能力。 接下来我们来看一个简单的例子和一个综合应用的例子。 牛刀小试——简化错误处理 之前,函数的正常结果和异常结果是无法统一的,体现在代码上往往以类似
利用Optional简化后的代码
这个逻辑并不复杂,但还是足以显示出合理抽象的威力,Optional提供了这样一种抽象,将错误处理的细节屏蔽掉了,我们只需要写数据转换的主逻辑,这种写与读的顺畅性在带给我们愉悦的同时,也提升了程序的正确性。在实际场景会遇到更复杂的多层嵌套各种if的代码,主流程非常不清晰,各种错误处理很容易出错,这个时候非常适合用Optional来简化。第二个版本是为了优化了可读性故意变成了多行,实际上只有一行代码
综合应用——关联值、递归、模式匹配、方法定义、与高阶函数结合 在swift中,枚举有几个新的能力,比如可以关联值,支持递归,进行模式匹配,定义方法,正是这些能力使得枚举实现了能力的进击,我们通过一个例子来展示一下这些特性如何让我们的表达更方便。 最近笔者在设计一个表达式引擎的方案,在一开始研究了一个非常简单的表达式系统,即有理数域的加减乘除,这里笔者组合了模式匹配、关联值、方法定义、递归枚举的能力,用很少的代码进行了抽象,并将这个四则运算的表达式系统用于计算经典的游戏算法——24点,24点的游戏抽象成算法问题是这样的:
在继续往下之前,读者可以思考一下使用OC应该如何解决。 接下来我们开始,假如4个数字是1,2,3,4,我们知道 这张图很直观的体现了3个信息:
因此我们可以利用枚举关联值、递归的能力建立表达式的模型,并且利用模式匹配定义求值的方法:
一个四则运算表达式的建模和求值就完成了。如果是利用class定义,需要定义一个类似Type的枚举来表示加减乘除,这就需要多写很多代码,更重要的是,加减乘除和具体的Double值之间的处理会比较繁琐,而对于枚举来说,就像呼吸一样自然。 那么怎么用这个Exp的枚举解决24点问题呢,这里一共有两大步:
限于篇幅,这里直接给出代码和注释
怎么样,是不是很简单,有了第一部分的抽象,第二部分代码除了递归的终止条件之外,都只有一行代码,这部分代码也展现了枚举与函数式编程结合后对于计算强大的抽象和表达能力。
Swift 中枚举的本质 除了官方文档和上面的两个例子之外,我们来聊聊枚举类型的本质,这里并不是去探究其底层实现,而是逻辑上应该如何理解枚举,以及什么情况下应该使用枚举。 对于类和结构体来说,我们可以定义多个属性,在一个实例中,这些属性的值是同时存在的,这就相当于多个值的与,逻辑上等价于数学上集合间的笛卡尔积,因此这两种被称为积类型。 对于枚举来说,无论我们定义多少个值,在一个实例中,只能存在一个,这就相当于多个值的或,逻辑上等价于数学上集合间的不相交并集,因此枚举被称为和类型。进一步说,Swift的枚举可以定义初始化器、方法和属性、遵循协议,其成员可以有关联值,基本上与类和结构体的能力对齐,这是因为枚举是积类型的对偶,也叫余积类型。 因此,可以得出使用枚举的充要条件,当取多个选项中的一个选项时,应该使用枚举,反之亦然,枚举适用于在多种情况下选择其一的场景,这样,就不会出现在一个类型中同时定义数据和errorCode的情况了。 在现代语言中,和类型的使用越来越多,最典型的就是是可空类型,Scala中的 ???拓展阅读 作者|四点 编辑|橙子君 出品|阿里巴巴新零售淘系技术 |
|
移动开发 最新文章 |
Vue3装载axios和element-ui |
android adb cmd |
【xcode】Xcode常用快捷键与技巧 |
Android开发中的线程池使用 |
Java 和 Android 的 Base64 |
Android 测试文字编码格式 |
微信小程序支付 |
安卓权限记录 |
知乎之自动养号 |
【Android Jetpack】DataStore |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/23 23:33:01- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |