索引超出范围 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的主要内容,如果未能解决你的问题,请参考以下文章