首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当其中一个元素在快速转换中失败时中止转换

当其中一个元素在快速转换中失败时中止转换
EN

Stack Overflow用户
提问于 2019-09-27 11:55:18
回答 3查看 69关注 0票数 0

在swift中,我们有更高阶的函数,如map、filter、reduce等数组

但是如果我有一个像Any = 1,2,3,"1“这样的数组呢?

我希望将此数组转换为Int的数组。但是由于数组中有"1“,所以我的逻辑是接受整个数组无效,我会将其映射到一个空数组。

在这种情况下,我如何使用更高的函数来实现它?

过滤很简单

代码语言:javascript
复制
let array: [Any] = [1, 2, 3, "1"]
let filtered = array.compactMap{ $0 as? Int}
/// prints [1, 2, 3]

但我希望最终结果是[],而不是1,2,3。

如何使用高阶函数来实现这一点?

EN

回答 3

Stack Overflow用户

发布于 2019-09-27 12:16:21

CompactMap

返回一个数组,该数组包含使用该序列的每个元素调用给定转换的非空结果。

所以你不能通过使用compactMap返回你想要的东西

代码语言:javascript
复制
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
    }
}
票数 0
EN

Stack Overflow用户

发布于 2019-09-27 12:41:19

假设array as? [Int] ?? []是不适用的(例如,您需要应用更复杂的转换),您可以改为throw一个错误。

代码语言:javascript
复制
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?来简化事情:

代码语言:javascript
复制
let array: [Any] = [1, 2, 3, "1"]
let ints = (try? array.map(convertOrThrow)) ?? []
票数 0
EN

Stack Overflow用户

发布于 2019-09-27 13:08:11

尽管这应该会起到作用,因为您只想检查数组是否为整数数组

代码语言:javascript
复制
array as? [Int] ?? []

但是,如果您不想使用上面的代码,您可能会对以下代码感兴趣

代码语言:javascript
复制
let filtered = array.filter{($0.self as? Int) == nil}.count == 0 ? array as! [Int] : []

如果有任何不是Int的元素,上述代码将生成[]

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58127648

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档