在 Swift 中执行映射时跳过项目?

问题描述 投票:0回答:2

我正在将地图应用到其中包含

try
的字典。如果映射的项目无效,我想跳过迭代。

例如:

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

在上面的示例中,如果

anotherFunc
返回
nil
,如何退出当前迭代并进入下一个迭代?这样,它就不会包含
nil
的项目。这可能吗?

swift generics try-catch swift2
2个回答
33
投票

只需将

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


0
投票

我在使用

compactMap
时跳过某个索引做了什么:

yourCollectionArray.enumerated().compactMap { index, element in
    // Skips the first 3 elements
    if index < 3 { return nil }


    // Return your transformed type here..
}
© www.soinside.com 2019 - 2024. All rights reserved.