Swift reduce函数使用示例详解
<div id="navCategory"><h5 class="catalogue">目录</h5><ul class="first_class_ul"><li>reduce</li><ul class="second_class_ul"><li>参数</li><li>示例</li><li>reduce(into:)</li></ul></ul></div><p class="maodian"></p><h2>reduce</h2><p>Swift中数组的<code>reduce</code>方法用于做序列元素的累加,如数组元素的累加, 函数原型:</p>
<div class="jb51code"><pre class="brush:cpp;">@inlinable
public func reduce<Result>(
_ initialResult: Result,
_ nextPartialResult: (Result, Element) throws -> Result) rethrows -> Result</pre></div>
<p class="maodian"></p><h3>参数</h3>
<ul><li>initialResult: 初始值, The value to use as the initial accumulating value. <code>initialResult</code> is passed to <code>nextPartialResult</code> the first time the closure is executed.</li><li>nextPartialResult: 下一次累加的基准值</li></ul>
<p class="maodian"></p><h3>示例</h3>
<div class="jb51code"><pre class="brush:cpp;">var arr =
/// initialResult: Result 初始值;
/// nextPartialResult:(Result, Int) 下一轮计算值, Result = initialResult + Int
/// Result是每轮计算的返回值(结果), Int 是数组元素
/// -&gt; Result 返回值
/// `arr.reduce(initialResult: Result, nextPartialResult: (Result, Int) throws -&gt; Result(Result, Int) throws -&gt; Result&gt;)`
var sum = arr.reduce(100) { partialResult, value in
print("\(value) --&gt; \(partialResult)")
return partialResult + value // return 可省略
}
// 初始值是100,第一步就是:
// 100 + 1
// 再把2加上 --&gt; 100 + 1 + 2
// 再把3加上 --&gt; 100 + 1 + 2 + 3
// ...
print(sum) // 136
</pre></div>
<p>当然,也有好吃的语法糖,效果是一样的:</p>
<div class="jb51code"><pre class="brush:cpp;">sum = arr.reduce(100) {
$0 + $1
}
print(sum)
</pre></div>
<p class="maodian"></p><h3>reduce(into:)</h3>
<p><code>reduce(into:)</code>方法也是一个实用方法,主要作用是遍历数组中的元素,把它们into到另一个对象中,示例:</p>
<p>如下有一个数组,把偶数放一个数组中,把奇数放一个数组中:</p>
<div class="jb51code"><pre class="brush:cpp;">let nums =
let result = nums.reduce(into: [[],[]]) { arr, num in
arr.append(num)
}
print(result) //
print(result) //
</pre></div>
<p>这里into:后面的[[], []]是一个二级数组,这个二维数组即闭包中的arr, 而闭包中的num是nums数组中每一个值,遍历后把这个二维数组返回 (由函数原型的inout可知,返回的其实就是into:参数,本例中即二维数组)</p>
<div class="jb51code"><pre class="brush:cpp;">func reduce<Result>(into: Result,
_ updateAccumulatingResult: (inout Result, Element)
throws -> ()
)
-> Result</pre></div>
<p>为了更方例理解,展开为:</p>
<div class="jb51code"><pre class="brush:cpp;">temp.append(1) //1%2 = 1/2 left 1 [[]]
temp.append(2) //2%2 = 2/2 left 0 []
temp.append(3) //3%2 = 3/2 = 1 left 1 []
temp.append(4) //4%2 = 4/2 left 0 []
temp.append(5) //5%2 = 5/2 = 2 left 1 []
</pre></div>
<p>示例参考:https://stackoverflow.com/questions/62103658/how-do-you-use-reduceinto-in-swift</p>
<p>再来看一个示例:</p>
<div class="jb51code"><pre class="brush:cpp;">// 统计下面的字符串中每个字符的使用次数
let letters = "abracadabra"
let letterCount = letters.reduce(into: [:]) { counts, letter in
counts += 1
}
print(letterCount) // ["a": 5, "r": 2, "c": 1, "b": 2, "d": 1]</pre></div>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202307/2023070710313101.png" /></p>
<p>其实就是遍历字符串,然后把它们into到字典[:]中</p>
<p>还有个示例:https://www.jb51.net/article/279000.htm说的比较好直接粘过来:</p>
<div class="jb51code"><pre class="brush:cpp;">struct Person {
enum Gender {
case male
case female
}
var name = ""
var age = 0
var gender = Gender.female
}
let dataSource = [Person(name: "鸡大宝", age: 38, gender: .male),
Person(name: "江主任", age: 50, gender: .female),
Person(name: "可乐", age: 10, gender: .female),
Person(name: "伍六七", age: 16, gender: .male),
Person(name: "梅花十三", age: 20, gender: .female)]
// 获取数据源中男女各多少人
let genderCount = dataSource.reduce(into: ()) { result, person in
result += 1
}
let maleCount = genderCount // 2
let femaleCount = genderCount // 3
print(maleCount ?? 0) // 2
print(femaleCount ?? 0) // 3</pre></div>
<p>通过这些示例,再不懂,中午就不要吃饭了</p>
<p>以上就是Swift reduce函数使用示例详解的详细内容,更多关于Swift reduce函数的资料请关注琼殿技术社区其它相关文章!</p>
<div class="art_xg">
<b>您可能感兴趣的文章:</b><ul><li>Swift函数提前返回实例详解</li><li>Swift如何调用Objective-C的可变参数函数详解</li><li>swift 常用高阶函数分享</li><li>C语言中调用Swift函数实例详解</li><li>深入理解swift变量和函数</li><li>详解Swift中的函数及函数闭包使用</li></ul>
</div>
</div>
<!--endmain-->
頁:
[1]