将数组转换为对象

时间:2020-09-07 19:27:25

标签: ios swift swiftui swift5

我有一个组织如下的列表:[“ ImageUrl”,“ Year”,“ Credit”,“ ImageUrl”,“ Year”,“ Credit” ...],并且我想显示图像的水平滚动视图以下是年份/学分。我已经尝试过像这样在SwiftUI中使用while循环,但是我收到一条错误消息,指出包含控制流语句的闭包不能与函数构建器'ViewBuilder'一起使用

这是我的代码:

struct ImageList : View {
    
    var listOfImages : Array<String>
    @State var i = 0
    
    var body: some View{
        VStack{
        while i < listOfImages.count {
            VStack(){
                KFImage(listOfImages[i]).resizable().frame(width: 200, height: 300).aspectRatio(contentMode: .fit)
                Text(listOfImages[i+1])
                Text(listOfImages[i+2])
                }
            i = i+3
            }
        }
    }
}

我无法更新列表的组织方式,因为它已经来自我们的后端。我最初的计划是将list元素导入这样的对象列表中:

struct HistoricalImages: Hashable {
    let link : String
    let year : String
    let credit : String    
}

但是我不确定如何有效地转换它。任何帮助表示赞赏。这是我的第一篇StackOverflow帖子,所以请告诉我是否需要添加任何内容!

2 个答案:

答案 0 :(得分:0)

使用索引范围将数组切片为3个元素的组,并为每个切片创建一个对象

var index = 0
var items = [HistoricalImages]()
while index < array.count {
    let end = index + 2
    if end > array.count {
        break
    }

    let slice = Array(array[index...end])
    items.append(HistoricalImages(link: slice[0], year: slice[1], credit: slice[2]))
    index += 3
}

答案 1 :(得分:0)

您不能在while属性内使用body循环:

while i < listOfImages.count {
...
}

您需要改用ForEach

ForEach(0..<listOfImages.count) { idx in
...
}