Swift中的高阶函数功能作用示例详解
<div id="navCategory"><h5 class="catalogue">目录</h5><ul class="first_class_ul"><li>高阶函数的作用</li><ul class="second_class_ul"><li>1. 简化代码</li><li>2. 提高可读性</li><li>3. 支持函数式编程</li><li>4. 提高代码的可重用性</li></ul><li>常见的高阶函数</li><ul class="second_class_ul"><li>1. map()</li><li>2. filter()</li><li>3. reduce()</li><li>4. sorted()</li><li>5. forEach()</li><li>6. compactMap()</li><li>7. flatMap()</li><li>8. zip()</li><li>9. first()</li><li>10. contains()</li></ul></ul></div><p class="maodian"></p><h2>高阶函数的作用</h2><div class="cros igoods"><div class="goodsin" data-img="https://img14.360buyimg.com/pop/jfs/t23545/97/1887471451/229732/be96aee/5b6d30efN406214df.jpg" data-name="零基础学Swift 图文版" data-owner="京东自营" data-price="86.1" data-tgid="38" data-url="https://union-click.jd.com/jdc?e=&p=JF8BAMoJK1olXwUFU1xdCE4TBl8IGF4UVAAAUm4ZVxNJXF9RXh5UHw0cSgYYXBcIWDoXSQVJQwYBUV9UDkkRHDZNRwYlPXF6Fy0daCx1Byt4SwYQOVpUUwMOTkcbM2gNHF4dXwMBZF5eDkwXAmoIK2sVXDZQOobrvpOysnPcsdTA1ZEyVW5dD00fCm8PG14dXw4CZF5VDHtUVypcWBhdbTYyV25tOEsnAF9WdVpGWwQCUVlaZhZAQm0MXVMRMwYHUVxVD0oVBV8KGloXXzYy"></div></div>
<p>Swift中的高阶函数是指那些参数或返回值是函数的函数。它们的存在使得我们可以用非常简洁和优雅的代码来解决许多问题。</p>
<p class="maodian"></p><h3>1. 简化代码</h3>
<p>高阶函数的一大作用是简化代码。例如,使用map函数可以对数组中的所有元素进行相同的操作。</p>
<p>假设我们有一个存储了一组整数的数组,现在想要对所有的元素进行加法操作,例如将数组中每个元素都加上10。如果没有map函数,我们可能需要写出如下代码:</p>
<div class="jb51code"><pre class="brush:cpp;">var numbers =
var result = ()
for number in numbers {
result.append(number + 10)
}
print(result) // 输出
</pre></div>
<p>在上边的代码中,我们使用循环遍历了数组,并对每个元素进行了加法操作,最终将结果存储到了另一个数组中。</p>
<p>使用map函数可以将上述代码简化成一行代码:</p>
<div class="jb51code"><pre class="brush:cpp;">let numbers =
let result = numbers.map { $0 + 10 }
print(result) // 输出
</pre></div>
<p class="maodian"></p><h3>2. 提高可读性</h3>
<p>高阶函数可以使得代码更容易理解和维护。例如,使用filter函数可以使得代码更加清晰地表达筛选的条件。</p>
<p>假设我们有一个存储了一组商品的数组,现在想要对商品进行筛选,只选择价格大于等于100的商品,并且将它们的名称存储到一个新的数组中。如果没有filter函数,我们可能需要写出如下代码:</p>
<div class="jb51code"><pre class="brush:cpp;">var products = [
Product(name: "iPhone", price: 999),
Product(name: "iPad", price: 699),
Product(name: "MacBook", price: 1499),
Product(name: "iPod", price: 199)
]
var result = ()
for product in products {
if product.price >= 100 {
result.append(product.name)
}
}
print(result) // 输出 ["iPhone", "iPad", "MacBook", "iPod"]
</pre></div>
<p>在上边的代码中,我们使用循环遍历了商品数组,对每个商品进行了价格判断,并将符合条件的商品名称存储到了另一个数组中。</p>
<p>使用filter函数可以将上述代码简化成一行代码:</p>
<div class="jb51code"><pre class="brush:cpp;">let products = [
Product(name: "iPhone", price: 999),
Product(name: "iPad", price: 699),
Product(name: "MacBook", price: 1499),
Product(name: "iPod", price: 199)
]
let result = products.filter { $0.price >= 100 }.map { $0.name }
print(result) // 输出 ["iPhone", "iPad", "MacBook", "iPod"]
</pre></div>
<p class="maodian"></p><h3>3. 支持函数式编程</h3>
<p>高阶函数是函数式编程的基石。使用高阶函数可以将计算过程分解成独立的函数块,从而实现函数的组合和复用。例如,以map和filter函数为例,说明高阶函数是如何实现函数的组合和复用的。</p>
<p>假设我们有一个存储了一组数字的数组,我们想要将每个数字平方,并将平方后的结果过滤出来,只保留那些大于10的数字。如果没有高阶函数,我们可能需要写出如下代码:</p>
<div class="jb51code"><pre class="brush:cpp;">let numbers =
var squaredNumbers = ()
for number in numbers {
let squared = number * number
if squared > 10 {
squaredNumbers.append(squared)
}
}
print(squaredNumbers) // 输出
</pre></div>
<p>上述代码中,我们使用循环遍历了数字数组,对每个数字进行了平方操作,并进行了判断过滤操作,将符合条件的数字存储到了另一个数组中。</p>
<p>使用高阶函数可以将上述代码简化成几行代码:</p>
<div class="jb51code"><pre class="brush:cpp;">let numbers =
let squaredNumbers = numbers.map { $0 * $0 }.filter { $0 > 10 }
print(squaredNumbers) // 输出
</pre></div>
<p class="maodian"></p><h3>4. 提高代码的可重用性</h3>
<p>高阶函数可以让我们抽象出通用的操作,从而让同一个函数可以适用于不同的场景。例如,使用reduce函数可以将一个操作应用于一个数组的所有元素,从而使得我们可以实现各种操作,例如求和、取最大值等等。</p>
<p>我们以求和为例说明reduce函数的应用:</p>
<p>假设我们有一个存储了一组数字的数组,我们想要求这组数字的和。如果没有reduce函数,我们可能需要写出如下代码:</p>
<div class="jb51code"><pre class="brush:cpp;">let numbers =
var sum = 0
for number in numbers {
sum += number
}
print(sum) // 输出 15
</pre></div>
<p>上述代码中,我们使用循环遍历了数字数组,并对每个数字进行了累加操作,得到最终的和。</p>
<p>使用reduce函数可以将上述代码简化成一行代码:</p>
<div class="jb51code"><pre class="brush:cpp;">let numbers =
let sum = numbers.reduce(0, +)
print(sum) // 输出 15
</pre></div>
<p class="maodian"></p><h2>常见的高阶函数</h2>
<p class="maodian"></p><h3>1. map()</h3>
<p>map()函数接受一个闭包作为参数,并对序列中的每个元素应用该闭包,最终返回一个新的序列,其中包含闭包的返回值。例如:</p>
<div class="jb51code"><pre class="brush:cpp;">let numbers =
let squaredNumbers = numbers.map { $0 * $0 }
print(squaredNumbers) //
</pre></div>
<p class="maodian"></p><h3>2. filter()</h3>
<p>filter()函数接受一个闭包作为参数,并返回一个新的序列,其中包含原序列中满足闭包条件的元素。例如:</p>
<div class="jb51code"><pre class="brush:cpp;">let numbers =
let evenNumbers = numbers.filter { $0 % 2 == 0 }
print(evenNumbers) //
</pre></div>
<p class="maodian"></p><h3>3. reduce()</h3>
<p>reduce()函数接受一个闭包作为参数,并对序列中的所有元素进行迭代运算,最终返回一个合并后的值。例如:</p>
<div class="jb51code"><pre class="brush:cpp;">let numbers =
let sum = numbers.reduce(0) { $0 + $1 }
print(sum) // 15
</pre></div>
<p class="maodian"></p><h3>4. sorted()</h3>
<p>sorted()函数接受一个闭包作为参数,并返回一个新的序列,其中包含原序列按照闭包指定的排序方式排列后的元素。例如:</p>
<div class="jb51code"><pre class="brush:cpp;">let numbers =
let sortedNumbers = numbers.sorted { $0 &lt; $1 }
print(sortedNumbers) //
</pre></div>
<p class="maodian"></p><h3>5. forEach()</h3>
<p>forEach()函数接受一个闭包作为参数,并对序列中的每个元素应用该闭包,但不返回任何值。例如:</p>
<div class="jb51code"><pre class="brush:cpp;">let numbers =
numbers.forEach { print($0) }
// 1
// 2
// 3
// 4
// 5
</pre></div>
<p class="maodian"></p><h3>6. compactMap()</h3>
<p>compactMap()函数接受一个闭包作为参数,并返回一个新的序列,其中包含原序列中不为nil的元素,通过闭包返回值的方式进行转换。例如:</p>
<div class="jb51code"><pre class="brush:cpp;">let numbers = ["1", "2", "3", "4", "5", "6"]
let evenNumbers = numbers.compactMap { Int($0) }.filter { $0 % 2 == 0 }
print(evenNumbers) //
</pre></div>
<p class="maodian"></p><h3>7. flatMap()</h3>
<p>flatMap()函数接受一个闭包作为参数,并返回一个新的序列,其中包含原序列中通过闭包返回值的方式进行转换后的所有元素。例如:</p>
<div class="jb51code"><pre class="brush:cpp;">let numbers = [, , ]
let flattenedNumbers = numbers.flatMap { $0 }
print(flattenedNumbers) //
</pre></div>
<p class="maodian"></p><h3>8. zip()</h3>
<p>zip()函数接受两个序列作为参数,并返回一个新的序列,其中包含两个序列中对应位置的元素进行组合后的元素。例如:</p>
<div class="jb51code"><pre class="brush:cpp;">let numbers1 =
let numbers2 =
let zippedNumbers = zip(numbers1, numbers2).map { $0 + $1 }
print(zippedNumbers) //
</pre></div>
<p class="maodian"></p><h3>9. first()</h3>
<p>first()函数接受一个闭包作为参数,并返回序列中符合闭包条件的第一个元素,如果没有符合条件的元素则返回nil。例如:</p>
<div class="jb51code"><pre class="brush:cpp;">let numbers =
let firstEvenNumber = numbers.first { $0 % 2 == 0 }
print(firstEvenNumber) // Optional(2)
</pre></div>
<p>这里的闭包接受一个元素作为参数,并返回一个Bool值来表示它是否符合条件。</p>
<p class="maodian"></p><h3>10. contains()</h3>
<p>contains()函数接受一个闭包作为参数,并返回一个Bool值,表示序列中是否存在符合闭包条件的元素。例如:</p>
<div class="jb51code"><pre class="brush:cpp;">let numbers =
let hasEvenNumber = numbers.contains { $0 % 2 == 0 }
print(hasEvenNumber) // true
</pre></div>
<p>这里的闭包接受一个元素作为参数,并返回一个Bool值来表示它是否符合条件。</p>
<p>高阶函数在项目中的使用非常重要,它们可以提高代码的可复用性、可读性、可拓展性和性能,从而让我们能够更加高效地开发出高质量的软件产品。</p>
<p>学习 Swift,勿忘初心,方得始终。但要陷入困境时,也不要忘了最初的梦想和时代所需要的技能。</p>
<p>以上就是Swift中的高阶函数功能作用示例详解的详细内容,更多关于Swift 高阶函数的资料请关注琼殿技术社区其它相关文章!</p>
<div class="art_xg">
<b>您可能感兴趣的文章:</b><ul><li>Swift 并发修改Sendable 闭包实例详解</li><li>Swift之for循环的基础使用学习</li><li>Swift简单快速的动态更换app图标AppIcon方法示例</li><li>Swift自动调整视图布局AutoLayout和AutoresizingMask功能详解</li><li>Swift 中 Opaque Types学习指南</li><li>Swift 中的 RegexBuilder学习指南</li><li>Swift并发系统并行运行多个任务使用详解</li></ul>
</div>
</div>
<!--endmain-->
頁:
[1]