我正在将地图应用到试用它的字典中.如果映射项无效,我想跳过迭代.
例如:
- func doSomething<T: MyType>() -> [T]
- dictionaries.map({
- try? anotherFunc($0) // Want to keep non-optionals in array,how to skip?
- })
- }
在上面的示例中,如果anotherFunc返回nil,如何转义当前迭代并继续下一步?这样,它就不会包含零项.这可能吗?
只需用flatMap()替换map():
- 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