,
let languages = ["en", "ru", "pt"]
let sheetValues = [["key", "general_ok", "connection_nointernet_message"], ["en", "Ok", "No internet connection"], ["ru", "russianOk", "No internet connection"], ["pt", "portugueseOk", "No internet connection"], ["description", "Ok", "No internet connection"], ["section", "General", "Connection"]]
我可以操纵 sheetValues
作为其转置来获取(如果需要)
我想要的如下:
[
[
"isoCode": "en",
"data": [SheetData("key": "general_ok", "value": "Ok", "description": "Ok", "section": "General"),
SheetData("key": "connection_nointernet_message", "value": "No internet connection", "description": "No internet connection", "section": "Conenction")]
],
[
"isoCode": "ru",
"data": [SheetData("key": "general_ok", "value": "russianOk", "description": "Ok", "section": "General"),
SheetData("key": "connection_nointernet_message", "value": "No internet connection", "description": "No internet connection", "section": "Conenction")]
],
[
"isoCode": "pt",
"data": [SheetData("key": "general_ok", "value": "portugueseOk", "description": "Ok", "section": "General"),
SheetData("key": "connection_nointernet_message", "value": "No internet connection", "description": "No internet connection", "section": "Conenction")]
]
]
型号:
struct Language {
var isoCode: String?
var data: [SheetData]?
}
struct SheetData {
let key: String
let value: String
var description: String?
let section: String
}
这就是我目前所拥有的,任何干净的方法来获取所需的(即[SheetData]
)?
func fetchLanguages() -> [Language] {
var allLanguages = [Language]()
for sheetValue in sheetValues {
var language = Language()
var allDataPoints = [SheetData]()
if let firstElement = sheetValue.first {
if languages.contains(firstElement) {
language.isoCode = firstElement
}
}
allLanguages.append(language)
}
return allLanguages
}
最佳答案
好的,我已经查看了您的数据并提出了解决方案。最后的结果
值应该包含您想要的数组。
// First create a dictionary with keys for each language
// In case new languages added or removed
let languages = ["en", "ru", "pt"]
var datas: [String: [String: Any]] = [:]
for language in languages {
var sheetData: [String: Any] = [:]
sheetData["isoCode"] = language
sheetData["data"] = []
datas[language] = sheetData
}
// Get your sheetValues from your source. Here I just used the array you provided.
let sheetValues = [["key", "general_ok", "connection_nointernet_message"],
["en", "Ok", "No internet connection"],
["ru", "russianOk", "No internet connection"],
["pt", "portugueseOk", "No internet connection"],
["description", "Ok", "No internet connection"],
["section", "General", "Connection"]]
// Loop the sheetValues starting from index 1 since index 0 holds the key values.
for i in 1..<sheetValues.count {
let languageKey = sheetValues[i][0]
if datas.keys.contains(languageKey) {
let firstSheetData = SheetData(key: sheetValues[0][1], // general_ok
value: sheetValues[i][1], // Ok, russianOk etc
description: sheetValues[sheetValues.count - 2][1], // Ok
section: sheetValues[sheetValues.count - 1][1]) // General
let secondSheetData = SheetData(key: sheetValues[0][2], // connection_nointernet_message
value: sheetValues[i][2], // No internet connection
description: sheetValues[sheetValues.count - 2][2], // No internet connection
section: sheetValues[sheetValues.count - 1][2]) // Connection
datas[languageKey]["data"] = [firstSheetData, secondSheetData]
}
}
// Loop the dictioanary holding the language datas
var result: [[String: Any]] = []
for (key, value) in datas {
result.append(value)
}
此解决方案仅适用于某些条件:
sheetValues
的索引 0 将始终具有key
值- sheetValues 中倒数第二个索引始终包含
description
值 sheetValues
的最后一个索引将始终具有section
值
关于arrays - Swift:将二维数组转换为自定义对象数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59100986/