迅速将var声明为一个组

时间:2019-11-07 22:52:09

标签: arrays swift initialization declaration var

我想声明一组相同的对象,就像这样。

var dave, paul, sam = UILabel()

我尝试了各种事情。但是除了标准之外,我无法做任何其他声明var的事情。

var dave = UILabel()
var paul = UILabel()
var sam = UILabel()

我认为必须以某种方式将其放入数组以加快处理过程。

1 个答案:

答案 0 :(得分:1)

除了使用命名变量,您还可以创建标签数组:

let labels = (0..<3).map { _ in UILabel() }

或者您也可以在创建它们时对其进行配置:

let labels = (0..<3).map { _ -> UILabel in 
    let label = UILabel()
    label.translatesAutoresizingMaskIntoConstraints = false
    return label
}

您可以在该关闭操作中对它们进行任何其他配置。

现在您可以使用它们了。例如,您可以将它们添加到已经具有垂直堆栈视图的视图中(这样您就不必为每个标签手动添加约束了),就像这样:

func viewDidLoad() {
    super.viewDidLoad()

    for label in labels {
        stackView.addArrangedSubview(label)
    }
}

如果您想为这些标签设置文字:

labels[0].text = "Dave"
labels[1].text = "Paul"
labels[2].text = "Sam"

这是说明上述内容的游乐场:

import UIKit
import PlaygroundSupport

class ViewController: UIViewController {
    let stackView: UIStackView = {
        let stackView = UIStackView()
        stackView.translatesAutoresizingMaskIntoConstraints = false
        stackView.axis = .vertical
        return stackView
    }()

    let labels = (0..<3).map { _ -> UILabel in 
        let label = UILabel()
        label.translatesAutoresizingMaskIntoConstraints = false
        return label
    }

    override func viewDidLoad() {
        super.viewDidLoad()

        addStackView()
        addLabels()
        updateLabels()
    }
}

private extension ViewController {
    func addStackView() {
        view.addSubview(stackView)
        NSLayoutConstraint.activate([
            stackView.centerXAnchor.constraint(equalTo: view.centerXAnchor),
            stackView.centerYAnchor.constraint(equalTo: view.centerYAnchor)
        ])
    }

    func addLabels() {
        for label in labels {
            stackView.addArrangedSubview(label)
        }
    }

    func updateLabels() {
        labels[0].text = "Dave"
        labels[1].text = "Paul"
        labels[2].text = "Sam"
    }
}

PlaygroundPage.current.liveView = ViewController()

现在,如果这是一个合适的应用程序,而不是游乐场,那么我可能只是使用@IBOutlet在IB中添加堆栈视图,而不是以编程方式进行操作,但我只是想举例说明