微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在非常量 Data swift 中循环

如何解决在非常量 Data swift 中循环

I want to make my own pagination  system 
I have an issue looping thru non-constant elements. 

我只想将初始列表中尚不存在的元素添加分页数据列表中,并位于下一个分页步骤之下。

我收到循环非常量元素的错误,或者,如果我尝试获取索引,则 func: 句柄分页不符合视图

 import SwiftUI


  var   dataModel1 :DataModel = .init()
  var   dataModel2 :DataModel = .init()
  var   dataModel3 :DataModel = .init()
  var   dataModel4 :DataModel = .init()


  class DataModel: ObservableObject  {
      
      
      var id: String
      var name: String

      public   init() {
          
          self.name = "VOID"
          self.id = UUID().description
          
      }
      
  }

  class DataListOO : ObservableObject {
      
      @Published var dataList = [DataModel]()
      
    
  }



  struct SwipeCellDemoView: View {
      
      
      @Observedobject var data3 = DataListOO()
      @Observedobject var paginatedData = DataListOO()
      
      
      
      @State private var index: Int = 0
      @State private var deleted: Bool = false
      @State private var dragCompleted: Bool = false
      @State private var numberElementsLoaded: Int = 6
      @State private var maxElementVisibleIndex: Int = 0
      @State private var numberOfPaginations : Int = 1
      @State private var isLoading : Bool = false
      
      @State private var shortList : Bool = true
      @State private var loading : String = "NOT"
      @State private var i : Int = 0
      
      
      init(){
          
          
          dataModel1.name = "1111"
          dataModel2.name = "222"
          dataModel3.name = "3333"
          dataModel4.name = "44444"
       
        
          
          data3.dataList.append(dataModel1)
          data3.dataList.append(dataModel1)
          data3.dataList.append(dataModel1)
          data3.dataList.append(dataModel1)
          data3.dataList.append(dataModel1)
          data3.dataList.append(dataModel1)
          data3.dataList.append(dataModel1)
          data3.dataList.append(dataModel1)
          data3.dataList.append(dataModel2)
          data3.dataList.append(dataModel3)
          data3.dataList.append(dataModel3)
          data3.dataList.append(dataModel3)
          data3.dataList.append(dataModel3)
          data3.dataList.append(dataModel3)
          data3.dataList.append(dataModel3)
          data3.dataList.append(dataModel3)
          data3.dataList.append(dataModel4)
          data3.dataList.append(dataModel4)
          data3.dataList.append(dataModel4)
          data3.dataList.append(dataModel4)
          data3.dataList.append(dataModel4)
          data3.dataList.append(dataModel4)
          data3.dataList.append(dataModel4)
          data3.dataList.append(dataModel4)
          data3.dataList.append(dataModel4)
          
          
          for i in 0..<6 {
              paginatedData.dataList.append(data3.dataList[i])
          }
       
          
      }
      
      var body: some View {
          
          Text(loading)
          
          vstack(){
            
              ScrollView(.vertical,showsIndicators: false){
                  
                  ScrollViewReader { value in
                      
                      Lazyvstack (alignment: /*@START_MENU_TOKEN@*/.center/*@END_MENU_TOKEN@*/,spacing: 0){
                          
                          ForEach(paginatedData.dataList.indices) { i in
                              
                              HStack(spacing: 16) {

                                  vstack(alignment: .leading) {
                                      
                                      Text(verbatim: paginatedData.dataList[i].name)
                                        
                                  }.onTapGesture {
                                      
                                  }
                              }
                              .padding()
                              .frame(width:400,height: 160)
                              
                              .onAppear(){
                            
                                  handlePagination(i)
                                  
                              }
                          }
                      }
                    
                  }
              }.disabled(isLoading)
              Spacer()
          }
          
         
          
          
      }
      
      
   
      
      //reset number pagination if research and if remove elements
      
      
      private func handlePagination(_ index : Int){
          
          if ( maxElementVisibleIndex < index ) {
              
              maxElementVisibleIndex = index
          }
         
       /* this is where I have the issue looping thru non-constant elements
      


          if (maxElementVisibleIndex == numberOfPaginations * Global.mainPaginationValue - 1)
          {
              
              ForEach(data3.dataList,id: \.id) { data in
                  
                  i =  data3.dataList.firstIndex(where: { $0.id == data.id })!
                  
                  /*
                   
                   if (i > numberElementsLoaded - 1 && i < numberElementsLoaded + Global.mainPaginationValue ){
              
                   
                   
                   paginatedData.dataList.append(data3.dataList[i])
                   
                   }
                   */
                  
              }
              
              
              
          }
          
          */
          
          
         numberOfPaginations = numberOfPaginations + 1
          numberElementsLoaded = numberElementsLoaded + Global.mainPaginationValue
             
          
          isLoading = true
          loading = "LOADING"
        
           dispatchQueue.main.asyncAfter(deadline: .Now()+3){
           isLoading = false
           loading = "NOT"
           print(loading)
           }
           
          
          
      }
      
  }

我得到循环通过非常量元素的错误,或者,如果我尝试获取索引,则函数:句柄分页不符合视图 问题出在上面,必须添加初始列表的正确元素

解决方法

这是基于 JArred 和 Jnpdx 帮助的答案: 对于非 View 相关的循环,对于非常量列表,使用:list.forEach{ element in

循环列表。完成后,就可以检索要添加的元素的索引(例如,对于分页,您不能使用值,只能使用位置)

与视图相关的循环:ForEach{ 索引不是强制性的,但在更改列表的情况下,必须添加它。因此,您再次检索列表元素的值而不是它的位置。

如果有人要在这个答案中添加一些元素,欢迎他。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。