![](https://img-blog.csdnimg.cn/20201014180756913.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
iOS Swift函数式编程专辑
文章平均质量分 84
酒茶白开水
这个作者很懒,什么都没留下…
展开
-
Swift函数式编程十三(函子、适用函子、单子)
解释一些函数式编程中的专用术语和一些常⻅模式,比如函子 (Functor)、适用函子 (Applicative Functor) 和单子 (Monad) 等。理解这些常⻅的模式,会有助于设计自己 的数据类型,并为 API 选择更合适的函数。目前已经遇到了几个被命名为 map 的方法,类型分别如下:每个 map 方法都需要两个参数:一个即将被映射的数据结构,和一个类型为 (T) -> U 的函数 transform。对于数组或可选值参数中所有类型为 T 的值,map 方法会使用 transform 将它们转原创 2022-06-01 09:59:03 · 230 阅读 · 0 评论 -
Swift函数式编程十二(表格应用)
代码地址这个示例为希望被解析的表达式编写解析器,并为这些表达式编写一个求值器,然后将其嵌入界面中。解析基于解析器组合算子中的算术表达式解析器,引入额外的抽象层级。之前,编写的解析器会直接返回计算结果。比如在解析 “2*3” 这样的乘法表达式时:let multiplication = curry { return $0*($1 ?? 1) }<^>integer<*>(character{ $0 == "*" }*>integer).optionalmultipl原创 2022-04-15 15:22:55 · 2451 阅读 · 0 评论 -
Swift函数式编程十一(解析器组合算子)
代码地址解析类似1+2*3这样的数学表达式。解析器类型通常一个解析器会接受一个字符串,解析成功返回一些值和剩下的字符串,解析失败则什么也不返回。这个过程总结为这样一个函数类型:typealias Parser<Result> = (String) -> (Result, String)?将Parser类型定义为一个结构体而不是简单的类型别名,这样能将组合算子编写为Parser内的方法而不是一些无主的函数,代码也会更加易读:struct Parser<Result>原创 2022-04-01 16:00:29 · 2383 阅读 · 0 评论 -
Swift函数式编程十(迭代器和序列)
代码地址迭代器(Iterators) 和序列(Sequences) 组成了 Swift 中 for 循环的基础部分。迭代器迭代器是每次根据请求生成新元素的“过程”,一个迭代器是遵守一下协议的任何类型:protocol IteratorProtocol { typealias Element func next() -> Element?}这个协议需要一个关联类型——Element,还有一个产生新元素的next方法,如果新元素存在就返回新元素,否则返回nil。下面的迭代原创 2021-11-29 15:56:25 · 1794 阅读 · 0 评论 -
Swift函数式编程九(图表)
代码地址一种描述图表的函数式方式,并利用 Core Graphics 来绘制它们。通过对 Core Graphic 进行一层函数式的封装,可以得到一个更简单且易于组合的API。绘制正方形和圆首先通过如下代码可以绘制下面的图表: let bound = CGRect(x: 0.0, y: 0.0, width: 80.0, height: 40.0) let renderner = UIGraphicsImageRenderer(bounds: bound)原创 2021-11-10 17:05:31 · 2391 阅读 · 0 评论 -
Swift函数式编程八(纯函数式数据结构)
代码地址纯函数式数据结构 (Purely Functional Data Structures) 指的是那些具有不变性的高效的数据结构。二叉搜索树使用indirect关键字将二叉树定义为一个递归枚举:indirect enum BinarySearchTree<Element: Equatable> { case leaf case node(BinarySearchTree<Element>, Element, BinarySearchTree<El原创 2021-10-31 11:02:14 · 1267 阅读 · 0 评论 -
Swift函数式编程七(枚举)
代码地址在 Objective-C 和其他类 C 语言中,枚举的声明方式是有一些缺陷的,作为类型来说并不够严密。因为所有的枚举类型实际上都是整数,所以有些整数值就会没有一个与之对 应的合法枚举,更糟糕的是,它们之间是可以进行运算的,就好像它们只是数字一样。仅仅依靠整数作为标记的枚举类型,并不满足 Swift 函数式编程中的一条核心原则:高效地利用类型排除程序缺陷。不同于 Objective-C,枚举在 Swift 中创建了新的类型,与整数或者其他已经存在的类型没有任何关系。enum Encoding原创 2021-07-22 17:24:48 · 174 阅读 · 0 评论 -
Swift函数式编程六(不可变性的价值)
代码地址变量Swift中的变量有两种,一种是不可变变量(用let申明),另一种是可变变量(用var申明)。很显然,不可变变量会限制变量的能力,通常可变变量的使用更加广泛。但是往往事实恰恰相反,例如当一个变量在很多地方被使用时,申明为不可变变量就更好,这样就无需当心该变量当前值是什么,也不用当心在赋值过程中对其他部分的不可变性造成破坏。值类型和引用类型Swift类型分为值类型和引用类型,最典型的例子就是结构体和类:struct PointStruct { var x: Int va原创 2021-07-20 10:42:54 · 144 阅读 · 0 评论 -
Swift函数式编程五(QuickCheck)
代码地址QuickCheck是一个用于随机测试的Haskell库,相对于独立的单元测试,QuickCheck描述函数抽象特性并生成测试来验证这些特性。生成随机数定义一个表达如何生成随机数的协议:protocol Arbitrary { static func arbitrary() -> Self}扩展Int类型,实现Arbitrary协议,在这里使用了arc4random函数来生成随机数然后转换成Int类型,事实上应该要能够生成负整数的:extension Int: Arbi原创 2021-07-12 15:05:12 · 228 阅读 · 0 评论 -
Swift函数式编程四(可选值)
Swift的可选类型可以用来表示可能缺失或是计算失败的值。案例:字典无法保证字典查询操作总是返回一个值,Swift可选类型可以表示这种失败的可能性:let citys = ["Paris": 2241, "Madrid": 3165, "Amsterdam": 827, "Berlin": 3562]let madridPopulation: Int? = citys["Madrid"]Swift可选类型解包方式:可选绑定使用!强制解包隐式解包使用??提供一个默认值// 强制解包原创 2021-07-07 11:00:58 · 319 阅读 · 0 评论 -
Swift函数式编程二(封装Core Image)
代码地址前言Core Image是一个强大的图像处理框架,但是API略显笨拙。它的API是弱类型的,通过键值编码(KVC)来配置图像滤镜(Filter)的,在使用参数的类型或名字时,都使用字符串来进行表示,这十分容易出错,极有可能导致运行时错误。因此打算利用类型来规避这些问题,最终实现一组类型安全且高度模块化的API。滤镜类型CIFilter是Core Image的核心类之一,用于创建图片...原创 2019-02-26 10:57:44 · 201 阅读 · 0 评论 -
Swift函数式编程三(Map、Filter和Reduce)
泛型介绍需求为写一个这样的函数,此函数接收一个参数为整型数组,返回一个一个新数组,新数组各项为原数组对应的数据加一。func incrementArray(array: [Int]) -&gt; [Int] { var result: Array&lt;Int&gt; = [] for i in array { result.append(i + 1) ...原创 2019-03-01 11:31:01 · 207 阅读 · 0 评论 -
Swift函数式编程一(函数式思想)
前言Swift函数式程序的特性:模块化:函数式编程更倾向于将程序反复分解为越来越小的模块单元,而这些块可以通过函数装配起来,以定义一个完整的程序。对可变状态的谨慎处理:面向对象编程专注于类和对象的设计,每个类和对象都有他们自己的分装状态。而函数式编程强调基于值编程的重要性,这能使我们免受可变状态或一些其他副作用的干扰。通过避免可变状态,函数式程序比其对应的命令式或者面向对象的程序更容易组合...原创 2018-11-21 10:43:15 · 925 阅读 · 0 评论