在斯威夫特4,你可以使用reduce(into:)
:
let (keys, values) = arr.reduce(into: ([String](), [[String]]())) {
$0.0.append($1.key)
$0.1.append($1.value)
}
你說:
但我也不希望事先將兩個目標數組聲明爲空數組,並在追加時循環一次,例如與forEach
。
就個人而言,這正是我所要做的。我只會寫一個這樣做的函數(這樣你就不會在你的代碼中使用該模式)。但我認爲以下內容比reduce
模式更清晰直觀,但不會遭受雙重方法的低效率。
/// Unzip an `Array` of key/value tuples.
///
/// - Parameter array: `Array` of key/value tuples.
/// - Returns: A tuple with two arrays, an `Array` of keys and an `Array` of values.
func unzip<K, V>(_ array: [(key: K, value: V)]) -> ([K], [V]) {
var keys = [K]()
var values = [V]()
keys.reserveCapacity(array.count)
values.reserveCapacity(array.count)
array.forEach { key, value in
keys.append(key)
values.append(value)
}
return (keys, values)
}
或者,如果你覺得有必要讓一個extension
,你能做到這一點,太:
extension Array {
/// Unzip an `Array` of key/value tuples.
///
/// - Returns: A tuple with two arrays, an `Array` of keys and an `Array` of values.
func unzip<K, V>() -> ([K], [V]) where Element == (key: K, value: V) {
var keys = [K]()
var values = [V]()
keys.reserveCapacity(count)
values.reserveCapacity(count)
forEach { key, value in
keys.append(key)
values.append(value)
}
return (keys, values)
}
}
實現這個,但是你會喜歡,但是當你擁有它的功能,你可以贊成清晰和意圖。
來源
2017-09-04 22:16:57
Rob
在斯威夫特4: let(keys,values)= arr.reduce(into:([String](),[[String]]())){$ 0.0.append($ 1.key); $ 0.1.append($ 1.value)}'。 – Rob
...或Swift 4使用較短的初始值:'let(keys,values)= arr。reduce(into:([],[])){$ 0.0.append($ 1.key); $ 0.1.append($ 1.value)}' – vacawama
@vacawama - 是的,但是'keys'和'values'的類型是[Any],因爲它無法成功推斷出正確的類型。 – Rob