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中找到示例 希望您喜欢阅读有关高阶函数的文章。 别忘了,拍手很重要。 快乐编码! 🖥