Swift 4 ~~高阶函数-过滤,映射,归约和排序
您可能已经听说过Swift中的高阶函数 。 简单来说,高阶函数是开发人员友好的代码段,可在几行内完成复杂的计算。
很快我们有了Filter() , Map() , Reduce()和Sorted() HOF。 所有这些都有其自身的优点,并且在我们的代码中易于使用。 让我通过Swift4中的一些有趣的示例向您展示如何使用它们。
1.过滤器(_ 🙂
Filter方法将检查条件,如果条件满足,它将返回一个对象。 您可以将filter(_ 🙂与String,Array,Dictionary,Set等一起使用。
让我们在Set上看看如何使用它。 我有一组名称,我需要选择只有5个字符的名称。 那我该怎么办呢?
//名称集
let nameSet:Set = [“ trivan”,“ mary”,“ larns”,“ tria”] //结果集
var resultSet:Set = [] //遍历nameSet中的每个元素
nameSet.forEach {(元素)在
如果element.count == 5 {
resultSet.insert(element)
}
} print(resultSet)
如何使用HOF 过滤器(_ 🙂完成此操作? 让我用过滤器(_ 🙂向您展示上述要求的代码
let nameSet:Set = [“ trivan”,“ mary”,“ larns”,“ tria”] //内联实现
let resultNames = nameSet.filter {$ 0.count == 5} //完整实现
让resultNames = nameSet.filter {(value)-> Bool in
返回value.count == 5
}打印(结果名称)
容易吧? 这里的$ 0 代表集合中的每个元素。
我们来看一下String中的 filter(_ 🙂 ,
让myString =“ Ananth” //内联
let myNumbers = myString.filter {“ Ananth Krishnan” .contains($ 0)} //完整实现
让myNumbers = myString.filter {(a)-> Bool in
返回“ Ananth Krishnan”。包含(a)
}打印(myNumbers)
现在在字典中
let myDictionary = [“ Ananth”:26,“ Roy”:27,“ Laila”:23,“ Louise”:28,“ Nova”:25] //内联实现
让resultDic = myDictionary.filter {$ 1 <25} //详细实现
让resultDic = myDictionary.filter {(name,age)-> Bool in
回归年龄<25
}
打印(resultDic)
这里的$ 1是第二个元素,在这种情况下是年龄。 如果您想要名称,则变量将为$ 0。 好的,就是Filter(_ :)。
2.地图(_ 🙂
Map(_ :)将帮助您更新/编辑数组或字典中的每个元素。 不用在for循环中遍历每个对象,只需使用map(_ :)。
让我们看看如何在字符串数组中使用它,
var nameArray = [“ trivan”,“ mary”,“ larns”,“ tria”] //内联-用`ii`替换出现的`a`
让resultNames = nameArray.map {$ 0.replacingOccurrences(of:“ a”,with:“ ii”)} //详细实现
让resultNames = nameArray.map {(element)-> String in
返回element.replacingOccurrences(of:“ a”,其中:“ ii”)
}打印(结果名称)
让我们看看地图如何在Dictionary中工作,
let myDictionary = [“ Ananth”:26,“ Roy”:27,“ Laila”:23,“ Louise”:28,“ Nova”:25] //内联
let tupleArray = myDictionary.map {($ 0,$ 1 * 2)} //详细功能
let tupleArray = myDictionary.map {(key:String,value:Int)在
返回(键,值* 2)
} myDictionary =字典(uniqueKeysWithValues:tupleArray)
打印(myDictionary)
还有一个地图函数称为– compactMap(_ :)`。 如果输入包含任何nil /可选值,则CompactMap(_ :)将优雅地处理可选值。 让我给你举个例子,
让nameArray:[String?] = [“ trivan”,nil,“ mary”,“ larns”,“ tria”]
让filterNilArray = nameArray.compactMap {$ 0?.replacingOccurrences(of:“ a”,with:“ A”)}
打印(filteredNilArray)
3.减少(_ 🙂
Reduce返回使用给定的闭包组合序列元素的结果。 reduce(_ :)函数内部有两个值。 一个是初始结果,它将是reduce函数的起始值。 如果没有结果要返回,我们将获得此初始值作为回报。 另一个值是部分结果,它是传递到下一个序列或最终结果的累加值。 让我们深入研究示例
在数组中,我们可以使用reduce为,计算总和,差或任何数学计算,找到最大/最小的字符串,字符数等。
让nameArray:[String?] = [“ trivan”,“ mary”,“ larns”,“ tria”] //打印最大的字符串
let nameReduce = nameArray.reduce(“”,{$ 0!.count> $ 1!.count?$ 0:$ 1})
打印(nameReduce)
在字典中,我们可以按如下方式使用Reduce(_ :),
let nameDic = [“ Ananth”:29,“ Roy”:27,“ Laila”:23,“ Louise”:28,“ Nova”:25] //内联返回具有最大数值(age)的名称
让name = nameDic.reduce((key:“”,value:0),{
返回$ 0.value> $ 1.value吗? $ 0:$ 1
})// 另一种方式
let name = nameDic.reduce((key:“”,value:0)){(res,arg1)在
返回res.value> arg1.value吗? res:arg1
}
name1print(名称)
4.排序(_ 🙂
Sorted(_ :)可用于重新排列值。 我们可以在String,Array,Dictionary等中使用它。让我们看一下示例。
让我们为ar添加sorted(_ 🙂
var numberArr = [4,6,3,1,6,8,9,0,4] var newArr = numberArr.sorted(by:{$ 0> $ 1})newArr = numberArr.sorted(by:>)newArr = numberArr .sorted(by:<)newArr = numberArr.sorted {$ 0 Bool in
返回a <b
}
打印(newArr)
让我们在String上尝试一下
var stringValue =“ Ananth”
var stringV = stringValue.sorted()
字串(stringV)
stringV = stringValue.sorted(by:<)
字串(stringV)
stringV = stringValue.sorted(by:>)
字串(stringV)
stringV = stringValue.sorted {$ 0> $ 1}
字串(stringV)
现在在字典上
let nameDic24 = [“ Ananth”:29,“ Roy”:40,“ Laila”:23,“ Louise”:28,“ Nova”:25] //按值(年龄)排序
让sortedKeysAndValues = nameDic24.sorted {$ 0.1 <$ 1.1} print(sortedKeysAndValues)
结论
如果您知道闭包和函数编程,则高阶函数很容易理解。 您可以在Github中找到示例。 希望您喜欢阅读有关高阶函数的文章。 别忘了,拍手很重要。 快乐编码! 🖥