从 Swift 中的循环中删除项目



非常简单的问题。我在 Swift 中的 for 循环中删除特定项目时遇到问题。我在滚动视图中显示不同的网络视图(每个网络视图都是不同的幻灯片),网址来自Firebase。这段代码效果很好,但如果 url 不可用,我希望能够删除该网站(幻灯片),这样它就不仅仅是一个空白框架。如果有更简单,更简单的方法,请告诉我。

func loadWebsites() -> [Website] {
let url1 = URL(string: "(nikeWebsite)")
let request1 = URLRequest(url: url1!)
let url2 = URL(string: "(finishlineWebsite)")
let request2 = URLRequest(url: url2!)
let url3 = URL(string: "(eastbayWebsite)")
let request3 = URLRequest(url: url3!)
let url4 = URL(string: "(footlockerWebsite)")
let request4 = URLRequest(url: url4!)
let url5 = URL(string: "(footactionWebsite)")
let request5 = URLRequest(url: url5!)
let url6 = URL(string: "(champsWebsite)")
let request6 = URLRequest(url: url6!)

let website1:Website = Bundle.main.loadNibNamed("Website", owner: self, options: nil)?.first as! Website
website1.webView.load(request1)
website1.webView.navigationDelegate = self

let website2:Website = Bundle.main.loadNibNamed("Website", owner: self, options: nil)?.first as! Website
website2.webView.load(request2)
website2.webView.navigationDelegate = self
let website3:Website = Bundle.main.loadNibNamed("Website", owner: self, options: nil)?.first as! Website
website3.webView.load(request3)
website3.webView.navigationDelegate = self
let website4:Website = Bundle.main.loadNibNamed("Website", owner: self, options: nil)?.first as! Website
website4.webView.load(request4)
website4.webView.navigationDelegate = self
let website5:Website = Bundle.main.loadNibNamed("Website", owner: self, options: nil)?.first as! Website
website5.webView.load(request5)
website5.webView.navigationDelegate = self
let website6:Website = Bundle.main.loadNibNamed("Website", owner: self, options: nil)?.first as! Website
website6.webView.load(request6)
website6.webView.navigationDelegate = self

return [website1, website2, website3, website4, website5, website6]
}
func setupWebsiteScrollView(websites : [Website]) {
scrollView.frame = CGRect(x: 0, y: 0, width: view.frame.width, height: view.frame.height)
scrollView.contentSize = CGSize(width: view.frame.width * CGFloat(websites.count), height: view.frame.height)
scrollView.isPagingEnabled = false
scrollView.isScrollEnabled = false
scrollView.contentInsetAdjustmentBehavior = .never
for i in 0 ..< websites.count {
websites[i].frame = CGRect(x: view.frame.width * CGFloat(i), y: 0, width: view.frame.width, height: view.frame.height)
scrollView.addSubview(websites[i])
//It would be an if statement that initially trigger the code I'm looking for
if nikeWebsite == nil {
websites.remove(at: 0)
}
}

收到此错误消息。

不能在不可变值上使用变异成员:"网站"是一个"让"常量

你的代码在几个层面上没有任何意义。

第一个问题:

此代码:

func foo() {
var array = ["a", "b", "c", "d", "e", "f"]
for index in 0..<array.count {
let item = array[index]
print("Item (item)")
array.remove(at: index)
}
}

会崩溃。

for 循环的范围在开始时生成,在执行 for 循环之前。由于数组中有 6 个项目,for 循环将遍历 0 到 5 的范围。

  1. 在第一次通过时,我们打印第一项"a"。
  2. 然后我们删除索引 0 处的项目
  3. 接下来,我们递增索引,并在索引 1 处获取项目。
  4. 现在,由于我们删除了"a",我们获取"c"。
  5. 然后我们从数组中删除"c"。
  6. 我们将索引增加到 2。索引 2 现在包含"e",我们打印它,然后从数组中删除
  7. 该数组现在仅包含 3 个项目。我们将索引增加到 3,并尝试在索引 3 处获取项目。但是,这超出了范围,所以我们崩溃了。

在通过数组编制索引时,无法从数组中删除项。你必须向后循环。

下一个问题:将数组作为函数参数传入。数组是按值传递的,因此参数是一个 let 常量。您无法修改数组。

您可以通过向后循环数组并使数组成为inout参数来解决这两个问题,但为什么呢?

func foo(_ array: inout [String]) {
for index in (0..<array.count).reversed() {
let item = array[index]
print("Item (item)")
array.remove(at: index)
}
}

为什么需要在处理数组时从数组中删除每个项目?

编辑:

相反,我建议使用一个函数来返回数组的副本,并删除丢弃的项目。filter函数正是这样做的。

最新更新