繁体   English   中英

Swiftui 2.0 如何访问 api 数组中的值并操作它们

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM