我应该快速使用For-in循环来设置字段值吗

时间:2018-06-21 19:05:52

标签: swift

我在Swift中创建了一个带有可编码数组的应用程序。我有一个布尔字段来显示列表中的哪个项目是活动记录。如果我选择列表中的另一个项目来激活(true),我想将所有其他记录标记为false。我想知道使用for-in循环是否是执行此操作的正确方法?

我有这段代码可以激活按钮,但是被告知这不是正确的方法。

   @IBAction func activateButtonTapped(_ sender: UIButton) {
        activateButton.isSelected = !activateButton.isSelected
        updateSaveButtonState()
   }

任何建议将不胜感激。

2 个答案:

答案 0 :(得分:1)

for循环将是最幼稚(简单)的方法,但是随着按钮数量的增加(您受O(n)时间的束缚),它并不是最有效的方法。

如果一次只能一个按钮处于活动状态,那么最好使用另一个变量来引用当前处于活动状态的按钮。您的代码将如下所示:

private weak var activeButton: UIButton?

@IBAction func activateButtonTapped(_ sender: UIButton) {
    activeButton?.isSelected = false
    sender.isSelected = true
    activeButton = sender
}

这可以确保O(1)时间。

如果您希望一次激活多个按钮,则可以使用一系列激活的按钮,将它们循环循环以停用。在那种情况下,您仍然会遇到最糟糕的O(n)时间复杂度,但几乎总是会遍历一小部分按钮。

答案 1 :(得分:0)

是的,for in循环将是完美的选择。您可以将所有按钮的选择状态设置为false,然后将刚刚激活的按钮选择状态设置为true

for button in buttons {
    button.isSelected = false
}
activateButton.isSelected = true

或者您也可以在循环中检查被点击的按钮是否在循环中。

for button in buttons {
    button.isSelected = button == activateButton
}