繁体   English   中英

Swift 意外无限 ForEach 循环

Swift Accidental Infinite ForEach Loop

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

我正在尝试使用 foreach 循环在列表中增加索引的帮助下显示 [[String]] 中的多个元素。 但是当我想生成列表时,无论指定的循环计数如何,循环都会无限重复。

这是我在循环中调用的函数,用于返回所需的字符串数组:

    func getPlaces (PlaceNumber: Int) -> [String]{
        
       
        if allPlaces.count - 1 >= PlaceNumber{
            
        return allPlaces[PlaceNumber]
        } else{
            
            return ["Not found",
                    "Not found",
                    "https://www.wikipedia.com",
                    "Not found",
                    "Not found"]
        }
    }

变量 'allPlaces' 是一个 [[String]] 并且其中有 25 个字符串数组 (0-24):

 let allPlaces: [[String]] =
    
    [["no sight",
      "No information",
      "https://www.wikipedia.com",
      "No information",
      "No information"],
     
     ["Tower of London",
      "The Tower of London, officially Her Majesty's Royal Palace and Fortress of the Tower of London, is a historic castle on the north bank of the River Thames in central London. It lies within the London Borough of Tower Hamlets, which is separated from the eastern edge of the square mile of the City of London by the open space known as Tower Hill. It was founded towards the end of 1066 as part of the Norman Conquest. The White Tower, which gives the entire castle its name, was built by William the Conqueror in 1078 and was a resented symbol of oppression, inflicted upon London by the new ruling elite. The castle was also used as a prison from 1100 until 1952, although that was not its primary purpose. A grand palace early in its history, it served as a royal residence.",
      "https://en.wikipedia.org/wiki/London_Bridge",
      "1066",
      "4"],

我们...

这是我的观点和递增的功能(我使用索引来访问 [[String]] 中的不同元素)。 我认为循环应该像'places.allPlaces'-数组计数一样频繁触发。 但它会无限触发。 即使我使用“0...24”而不是“places.allPlaces”。

struct ListOfPlacesView: View {
    
    @StateObject var location = Location()
    @StateObject var places = Places()
    @State var index = 0
    
    var body: some View {
        NavigationView{
            List{
                ForEach (places.allPlaces, id: \.self) { _ in
                    Text(incrementIndex())
                }
            }
        }
        .navigationTitle("All Places")
    }
    
    func incrementIndex() -> String{
        index += 1
        print(index)
        return  (places.getPlaces(PlaceNumber: index)[0])
    }
}

但是当我开始这个时,'print(index)'在控制台中计数为无穷大,视图甚至不会加载。 当我删除 'index += 1' 时,循环会打印 Array 的第一个元素 25 次,就像它应该的那样。

我不想在列表中包含 [[String]] 的第一个元素,这就是我从索引 0 开始并首先递增的原因。

您知道为什么会发生这种情况以及如何阻止应用程序这样做吗? 或者知道更好的增量方法? 抱歉,如果描述得不好,请问您是否无法弄清楚。

1 个回复

您的incrementIndex()函数会更新变量@State var index 这将导致视图重新渲染并再次调用incrementIndex() 这会导致无限循环。

目前,您没有使用 ForEach 提供的函数参数,而是通过将其命名为_来丢弃它。 我建议使用 ForEach 已经提供的值,而不是索引:

ForEach(places.allPlaces, id: \.self) { place in
    Text(place[0])
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题
 
粤ICP备18138465号  © 2020-2022 STACKOOM.COM