swift2 在Swift中执行Map时是否跳过项目?

qgzx9mmu  于 2022-11-06  发布在  Swift
关注(0)|答案(1)|浏览(154)

我正在将Map应用到包含try的字典中。如果Map项无效,我希望跳过迭代。
例如:

func doSomething<T: MyType>() -> [T]
    dictionaries.map({
        try? anotherFunc($0) // Want to keep non-optionals in array, how to skip?
    })
}

在上面的示例中,如果anotherFunc返回nil,如何跳出当前迭代并移到下一个迭代?这样,它就不会包含nil的项。这可能吗?

dbf7pr2w

dbf7pr2w1#

只需将map()替换为flatMap()即可:

extension SequenceType {
    /// Returns an `Array` containing the non-nil results of mapping
    /// `transform` over `self`.
    ///
    /// - Complexity: O(*M* + *N*), where *M* is the length of `self`
    ///   and *N* is the length of the result.
    @warn_unused_result
    public func flatMap<T>(@noescape transform: (Self.Generator.Element) throws -> T?) rethrows -> [T]
}

如果调用抛出错误,try? ...将返回nil,因此这些元素将在结果中被忽略。
以下是一个用于演示的自包含示例:

enum MyError : ErrorType {
    case DivisionByZeroError
}

func inverse(x : Double) throws -> Double {
    guard x != 0 else {
        throw MyError.DivisionByZeroError
    }
    return 1.0/x
}

let values = [ 1.0, 2.0, 0.0, 4.0 ]
let result = values.flatMap {
    try? inverse($0)
}
print(result) // [1.0, 0.5, 0.25]

对于Swift 3,ErrorType替换为Error
对于
Swift 4
,请使用compactMap

相关问题