Tag: 功能性编程

在Swift上使用函数式编程

在本文中,我将尝试以最简单的方式说明如何尊重函数式编程的构建块,该模型经过数小时的研究,发现它并未得到充分利用。 Swift是一个功能对象混合体,因此它为我们提供了应用功能编程的支持,无论是类型推断还是灵活的功能管理。 快速回顾一下范式: 函数是一个转换,它接受一个(或几个)参数并返回一个值。 函数也是范例的一等公民 ,这意味着它是一个值,可以将其作为参数传递给另一个函数,获取结果甚至存储它。 以Currying为基础,我们可以给函数提供比期望少的参数,因此它将给我们带来期望缺少参数的函数。 此概念称为部分应用程序 。 我们也可以像在数学世界中一样在彼此之间编写函数,只要第一个函数的输出与第二个函数的输入匹配即可。 我们还可以将函数作为其他函数的参数传递。 将其他函数作为参数接收的函数称为高阶函数 。 如果没有支持不可变性的上下文,这一切都是不可能的,这意味着我们的函数不会更改我们的数据,而是会给我们提供副本,这是将函数应用于原始数据的结果。 每次我们调用具有特定值的函数时,预期结果都是相同的。 这些概念是范式的基础,将它们组合在一起可以赋予我们极大的灵活性,更高的代码可重用性百分比,并使我们可以构建更具声明性的组件。 现在,我们如何在Swift这样的混合语言中应用这些概念,并专注于功能的一部分? 职能和一等公民 在任何事情之前,我们定义“添加”功能: func add(number:Int,otherNumber:Int)-> Int { 返回号码+其他号码 } 它的类型是: 添加::(Int,Int)-> Int 范式允许我们在恒定的情况下存储此函数: 让storedAdd:(Int,Int)-> Int =添加 或者也可以像这样直接定义: 让加= {(num(num:Int,otherNum:Int)in num + otherNum} 返回值是隐式的,类型是自动推断的。 这两个声明是等效的,因此它的使用取决于首选项和上下文。 定义函数后,假设我们要将5加到几个数字上: 让foo = add(5,1)let bar = add(5,5)let bla = add(5,100) 您在这里看到问题了吗? 在每种情况下,我们都重复相同的操作,即增加5。如果我们想再执行10次该怎么办? 样板代码。 如果我们要进行更改怎么办? 如果不是要加5,而要加20,该怎么办?复制粘贴不是一种选择。 […]

Swift中的“变异”

众所周知,类是引用类型,而结构和枚举是快速的值类型。 这意味着类对象共享该对象的单个实例,并在传递给任何函数或新对象时传递相同的引用,而值类型是创建其副本并仅传递值的类型。 如果我们尝试更改类中的任何变量,那就很简单。 班级员工{ var名称:字符串 var teamName:字符串 init(name:String,teamName:String){ self.name =名称 self.teamName = teamName } func changeTeam(newTeamName:String){ self.teamName = newTeamName } } var emp1 = Employee(name:“ Suneet”,teamName:“ Engineering”) print(emp1.teamName)//工程 emp1.changeTeam(newTeamName:“产品”) print(emp1.teamName)//产品 而如果您尝试在任何值类型中执行相同操作,则会向我们显示编译错误, struct Employee { var名称:字符串 var teamName:字符串 init(name:String,teamName:String){ self.name =名称 self.teamName = teamName } func changeTeam(newTeamName:String){ self.teamName = newTeamName //无法分配给属性:“ self”是不可变的 } } 它会向我们显示以下错误 无法分配给属性:“自我”是不可变的 […]

Swift中的“ inout”

最近,在使用swift时,我想到了一个用例,其中我需要修改作为参数传递给函数的变量。 最终,传递给函数的所有变量都是不可变类型,无法更改,类似于let变量。 如果它是一个类对象,则不能创建新对象,但可以操纵该类对象的属性,也可以使用该对象调用任何函数。 班级员工{ var名称:字符串 变量年龄:整数 init(名称:字符串,年龄:整数){ self.name =名称 自我年龄=年龄 } } func changeEmployeeData(emp:Employee){ employee.name =“ Suneet” 员工年龄= 25 } 让员工=员工(姓名:“随机”,年龄:10) print(employee.name)//随机 print(employee.age)// 10 changeEmployeeData(emp:员工) print(employee.name)// Suneet print(employee.age)// 25 现在,当您的参数为原始数据类型时,就会发生问题,您根本无法更改该值。 变量:Int = 1 func changeNumber(数字:整数){ num = 2 打印(数字) } changeNumber(num:变量) 它将显示错误“无法分配给值:’num’是’let’常量”,这是不言自明的。 我们不能修改作为参数传递的参数,因为它们是let类型的。 现在,如果要修改此值怎么办? inout救援。 您可以在inout传递参数的地方使用它作为参考。 变量:Int = 1 func changeNumber(num:inout Int){ num = 2 […]