[英]Swiftui 2.0 how can I access values in an api array and manipulate them
我是 swift 和 swift 的新手。 我有一個返回數組的 api 調用,現在我正在獲取數據並將其顯示在列表中。 我想要做的是訪問數組中的各個字段並在它顯示在列表中之前更改它們。 這是我的代碼。 在MainViewModel類中,我從 API 獲取結果,我想在那里訪問全名字符串,以便我可以將其全部設為大寫。 任何幫助都會很棒
struct MainModel: Decodable,Identifiable {
var id: Int?
var fullname: String?
var time: String?
}
class MainViewModel: ObservableObject {
func MainViewRequest(completion: @escaping([MainModel]) -> ())
{
let parameter = "id=1"
let request = RequestObject(AddToken: true, Url: "Home/MainView", Parameter: parameter)
URLSession.shared.dataTask(with: request) { data, response, error in
guard let Data = data else { return }
do {
let value = try JSONDecoder().decode(Array<MainModel>.self, from: Data)
DispatchQueue.main.async {
// how can I get FullName property here
completion(value)
}
}
catch {
print(error)
}
}.resume()
}
}
struct MainView: View {
@StateObject var mainVM = MainViewModel()
@State var model: [MainModel] = []
var body: some View {
List {
ForEach(model) { value in
Text("\(value.fullname ?? "")")
Spacer()
Text("\(value.time ?? "")")
}
}.onAppear(){
mainVM.MainViewRequest() { data in
model = data
}
}
}
}
有幾種方法可以實現您的目標。
使用map
來轉換值
任何時候您想轉換一組值map
都值得考慮。 你提供的閉包在集合的每個元素上被調用,你可以返回一個轉換后的值(它甚至可以是不同的類型)。 為了簡單起見,我將把東西打包回您的 MainModel 對象之一。
這就是它的樣子:
let values = try JSONDecoder().decode(Array<MainModel>.self, from: Data)
// Process the values off the main thread
let modifiedValues = values.map { value in
MainModel(id: value.id,
fullname: value.fullname?.uppercased(),
time: value.time
)}
DispatchQueue.main.async {
// Use the processed values in the main thread
completion(modifiedValues)
}
但這可能不是理想的做事方式。 我之所以這么說是因為將某些內容轉換為大寫不是可逆操作,因此,在下載數據的所有麻煩之后,您正在丟棄信息。
在視圖中變換
如果您只想將其大寫以用於演示目的,最好在您的視圖中這樣做:
ForEach(model) { value in
Text("\(value.fullname?.uppercased() ?? "")")
Spacer()
Text("\(value.time ?? "")")
}
擴展中的計算屬性
這個選項是我在自己的代碼中經常使用的選項。 在擴展中,我添加了計算顯示和格式相關的計算屬性。
extension MainModel {
var displayFullName: String { fullname?.uppercased() ?? "" }
}
然后,您可以按如下方式修改視圖代碼的循環:
ForEach(model) { value in
Text("\(value.displayFullName)")
Spacer()
Text("\(value.time ?? "")")
}
我喜歡這種方法,因為原始的外殼版本仍然可用,您沒有丟失任何信息。 您可以在整個代碼中的任何需要它的地方使用該擴展……它可以整理視圖代碼。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.