快速提示:基于闭包的CollectionType API
我们每天处理数据集合,无论它们是字典,数组还是集合。 使用集合会导致很多样板工作: for-in
语句,临时存储变量和许多代码行。
Swift引入了一组新的,基于闭包的功能性API,用于处理集合。 这些方法减少了样板代码,有助于突出显示重要信息并提高可读性。 这些方法也是可链接的,因此您可以轻松组成高级逻辑。
核心方法
forEach(_:)
这是一个简单的迭代器,它以与for-in
相同的顺序调用self
每个元素的闭包。
[“ a”,“ b”,“ c”,…,“ z”]。forEach {
print(“ \(element),“)
}
//打印:a,b,c,…,z,
map(transform:)
这将返回一个Array,其中包含将转换映射到self
的结果。
let upperCaseLetters = [“ a”,“ b”,“ c”,…,“ z”]。map {
返回element.uppercase
}
// upperCaseLetters为[“ A”,“ B”,“ C”,…,“ Z”]
filter(predicate:)
这将返回一个数组,其中包含满足提供的谓词的self
的有序元素。
let元音= [“ a”,“ b”,“ c”,…,“ z”]。filter {
返回元素==“ a”
|| 元素==“ e”
|| 元素==“ i”
|| 元素==“ o”
|| 元素==“ u”
}
//元音为[“ a”,“ e”,“ i”,“ o”,“ u”]
reduce(initial:,combine:)
这将返回重复调用的结果,并combine
一个初始化为initial
的累加值以及self
每个元素。
让AlphabetString = [“ a”,“ b”,“ c”,…,“ z”]。 降低(””) {
CombinedElements,元素位于
返回CombinedElements.appending(element)
}
// AlphabetString为“ abc ... z”
奖金法
flatMap(transform:)
这将返回一个Array,其中包含对self
进行映射transform
并将结果展平的结果。
警告:如果不小心, flatMap(_:)
可能会有意外的副作用。 例如:
让a = [[“ a”,“ b”],nil,[“ c”,“ d”],[“ e”,“ f”,“ g”]]]
print(a.flatMap {return $ 0})
// [[“ a”,“ b”],[“ c”,“ d”],[“ e”,“ f”,“ g”]]]
令b = [[“ a”,“ b”],[“ c”,“ d”],[“ e”,“ f”,“ g”]]
print(b.flatMap {return $ 0})
// [“ a”,“ b”,“ c”,“ d”,“ e”,“ f”,“ g”]
在第一个示例中,数组a
具有nil
元素。 调用flatMap
,该数组被“展平”以仅包含非nil
元素。 在第二个示例中,数组b
仅具有非nil
元素。 调用flatMap
,子数组将展平为单个数组。
以下是有关使用集合类型的一些注意事项:
- 这些不是银弹。 您有时仍然需要使用
for-in
。 例如,在这些方法中使用的闭包内,您不能通过调用break
,continue
,return
等来影响外部范围。 - 您还可以传递与闭包共享类型签名的函数。 这是在其他地方存储复杂功能并保持逻辑简单,整洁和内联的好方法。
专家提示:这些收集API还可作为如何构建通用的,面向协议的API的出色参考。
此处介绍的基于闭包的API确实可以通过删除大量样板并向前进的代码来帮助提高代码库的可读性和可维护性。
下周返回,详细了解如何配置与闭包内联的属性。