在 Swift 中执行地图时跳过项目?
Skip item when performing map in Swift?
我正在将地图应用于其中包含 try
的字典。如果映射项无效,我想跳过迭代。
例如:
func doSomething<T: MyType>() -> [T]
dictionaries.map({
try? anotherFunc([=11=]) // Want to keep non-optionals in array, how to skip?
})
}
在上面的示例中,如果anotherFunc
returns 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]
}
try? ...
returns 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([=11=])
}
print(result) // [1.0, 0.5, 0.25]
对于Swift 3,将ErrorType
替换为Error
。
对于Swift 4 使用compactMap
我正在将地图应用于其中包含 try
的字典。如果映射项无效,我想跳过迭代。
例如:
func doSomething<T: MyType>() -> [T]
dictionaries.map({
try? anotherFunc([=11=]) // Want to keep non-optionals in array, how to skip?
})
}
在上面的示例中,如果anotherFunc
returns 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]
}
try? ...
returns 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([=11=])
}
print(result) // [1.0, 0.5, 0.25]
对于Swift 3,将ErrorType
替换为Error
。
对于Swift 4 使用compactMap