我有這 3 個陣列
names = ["tomatoes", "bananas", "carrot", "tshirt", "microwave"]
categories = ["food", "food", "food", "clothing", "kitchen"]
prices = ["1.49", "0.79", "1.99", "7.99", "200.99"]
我想為他們每個人創建和排列這樣的
["food", "tomatoes", "1.49"]
我有很多資料,所以我正在嘗試創建一個更有效地執行此操作的函式,然后我將嘗試將所有內容組合成一個大陣列。例如:[["food", "tomatoes", "1.49"], ["food", "bananas", "0.79"], ["food", "carrot", "1.99"], ["clothing", "tshirt", "7.99"], ["kitchen", "microwave", "200.99"]]我嘗試使用地圖,但我對編程不太熟悉,所以我無法解決這個問題
uj5u.com熱心網友回復:
不是您問題的直接答案,但您真正需要的是構建資料:
struct Product {
let name: String
let category: Category
let price: Double
}
enum Category: String {
case food, clothing, kitchen
}
然后您可以簡單地創建一個產品陣列:
var products: [Product] = []
uj5u.com熱心網友回復:
您想壓縮三個序列,但標準庫目前只支持兩個。有關依賴代碼生成的出色解決方案,請參閱this other answer 。這是另一個沒有的解決方案:
Array([categories, names, prices].zipped)
import Algorithms // for `compacted`
public extension Sequence where Element: Sequence {
/// Like `zip`, but with no limit to how many sequences are zipped.
var zipped: AnySequence<[Element.Element]> {
.init(
sequence(
state: map { $0.makeIterator() }
) { iterators in
let compacted = iterators.indices.map { iterators[$0].next() }.compacted()
guard compacted.count == iterators.count else {
return nil
}
return .init(compacted)
}
)
}
}
uj5u.com熱心網友回復:
這樣做的簡單方法是并行回圈三個陣列。為了防止索引錯誤,您應該在最小陣列的范圍內作業。您可以使用for回圈來完成,但 IMO 使用 ' 更清潔reduce(into:)
let items = min(names.count, categories.count, prices.count)
let all = ( 0 ..< items ).reduce(into: [[String]]()) {
$0.append( [names[$1], categories[$1], prices[$1] ])
}
或者,接受@Leo Dabus 的好建議:
let products = ( 0 ..< items ).reduce(into: [Product]()) {
$0.append( Product(name: names[$1], category: categories[$1], price: prices[$1]) )
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/438921.html
上一篇:在swiftui視圖中更改布林值
