gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 13:23:07 26 4
gpt4 key购买 nike

我正在将映射应用到其中包含 try 的字典。如果映射的项目无效,我想跳过迭代。

例如:

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

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

最佳答案

只需将 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]
}

试试? ... 如果调用抛出错误,则返回 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

关于swift - 在 Swift 中执行映射时跳过项目?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37544175/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com