索引超出范围 SwiftUI

Posted

技术标签:

【中文标题】索引超出范围 SwiftUI【英文标题】:Index out range SwiftUI 【发布时间】:2021-07-23 20:07:31 【问题描述】:

我在以下代码中遇到索引超出范围错误。 list.datas 似乎适用于 foreach 循环,但是当我想访问 HomeView 上的索引 list.datas[0] 时,它给了我一个索引超出范围错误。这是代码。我唯一能想到的是api调用没有及时访问索引,但如果是这样的话,为什么我可以在foreach循环中访问它。

struct HomeView: View 
    @ObservedObject var list = getData()
    let screen = UIScreen.main.bounds
    var body: some View 
        
        NavigationView 
            ScrollView 
            HeadView(dataType: list.datas[0])             
                .frame(width:screen.width, height: screen.height / 3)
            
                
            ForEach(list.datas)  i in
                
                NavigationLink(destination: webView(url: i.url).navigationBarTitle("", displayMode: .inline)) 
                    HStack(spacing: 15) 
                        VStack(alignment: .leading, spacing: 10) 
                            Text(i.title)
                                .fontWeight(.heavy)
                            Text(i.desc)
                                .lineLimit(2)
                            
                        
                        
                        
                        if i.image != "" 
                            KFImage(URL(string:i.image)).resizable()
                                .frame(width:100, height: 70)
                                .cornerRadius(20)
                                .scaledToFill()
                                .clipped()
                        
                        
                        
                        
                        
                        
                        
                    .padding(.vertical,15)
                    .padding(.horizontal,15)
                    .foregroundColor(.black)
                    
                
            .navigationBarTitle("")
            .navigationBarHidden(true)
            
            .edgesIgnoringSafeArea(.all)
            
           
        
        
    


这是进行 api 调用的视图模型

class getData : ObservableObject 
    @Published var datas = [dataType]()
    
    
    init() 
        let source = "https://newsapi.org/v2/top-headlines?country=us&apiKey=e415be6fa3a9433b9277971bd319b729"
        
        let url = URL(string: source)!
        
        let session = URLSession(configuration: .default)
        
        session.dataTask(with: url)  (data, _, err) in
            if err != nil 
                print(err?.localizedDescription)
                return
            
            
            let json = try! JSON(data: data!)
            
            for i in json["articles"] 
                let title = i.1["title"].stringValue
                let description = i.1["description"].stringValue
                let url = i.1["url"].stringValue
                let image = i.1["urlToImage"].stringValue
                let id = i.1["publishedAt"].stringValue
                
                DispatchQueue.main.async 
                    self.datas.append(dataType(id: id, title: title, desc: description, url: url, image: image))
                
                
            
        .resume()
    
    


【问题讨论】:

【参考方案1】:

我唯一能想到的是api调用没有及时访问索引

这正是问题所在。 SwiftUI 视图经常渲染,你必须确保视图可以用一个空数组来渲染。因此,永远不要在视图主体中从具有索引订阅的数组中获取项目。

一种解决方案是获取first 项目,该项目返回一个可选值并在数组为空时分配一个默认值,例如

HeadView(dataType: list.datas.first ?? dataType())  

顺便说一下,请以大写字母开头的结构和类命名。

【讨论】:

以上是关于索引超出范围 SwiftUI的主要内容,如果未能解决你的问题,请参考以下文章

索引超出范围的 SwiftUI 问题

SwiftUI:JSON 索引总是超出范围

索引超出范围 SwiftUI

SwiftUI 网格索引超出范围

表单中的 SwiftUI 选择器 - 索引超出范围

SwiftUI:从 ForEach 中删除项目导致索引超出范围