在swift中,我们有更高阶的函数,如map、filter、reduce等数组
但是如果我有一个像Any = 1,2,3,"1“这样的数组呢?
我希望将此数组转换为Int的数组。但是由于数组中有"1“,所以我的逻辑是接受整个数组无效,我会将其映射到一个空数组。
在这种情况下,我如何使用更高的函数来实现它?
过滤很简单
let array: [Any] = [1, 2, 3, "1"]
let filtered = array.compactMap{ $0 as? Int}
/// prints [1, 2, 3]但我希望最终结果是[],而不是1,2,3。
如何使用高阶函数来实现这一点?
发布于 2019-09-27 12:16:21
CompactMap
返回一个数组,该数组包含使用该序列的每个元素调用给定转换的非空结果。
所以你不能通过使用compactMap返回你想要的东西
let array: [Any] = [1, 2, 3, "1"]
for case let element in array {
if let _ = element as? Int {
continue
} else {
print("\(element) isn't an Int, so array is invalid")
break
}
}发布于 2019-09-27 12:41:19
假设array as? [Int] ?? []是不适用的(例如,您需要应用更复杂的转换),您可以改为throw一个错误。
enum ConversionError: Error {
case notAllValuesWereInts
}
func convertOrThrow(_ input: Any) throws -> Int {
switch input {
case let int as Int: return int
default: throw ConversionError.notAllValuesWereInts
}
}
let array: [Any] = [1, 2, 3, "1"]
let ints: [Int]
do {
ints = try array.map(convertOrThrow)
} catch {
ints = []
}
print(ints)在这种情况下,error用于控制流,没有携带任何有用的信息,您可以使用try?来简化事情:
let array: [Any] = [1, 2, 3, "1"]
let ints = (try? array.map(convertOrThrow)) ?? []发布于 2019-09-27 13:08:11
尽管这应该会起到作用,因为您只想检查数组是否为整数数组
array as? [Int] ?? []但是,如果您不想使用上面的代码,您可能会对以下代码感兴趣
let filtered = array.filter{($0.self as? Int) == nil}.count == 0 ? array as! [Int] : []如果有任何不是Int的元素,上述代码将生成[]
https://stackoverflow.com/questions/58127648
复制相似问题