在swift中将var声明为一个组



我想声明一组相同的对象,如下所示。

var dave, paul, sam = UILabel()

我试过各种各样的东西。但是,除了标准之外,我不能做任何不同的事情来声明vars。

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

我认为必须有某种方法将其放入数组中,以加快进程。

您可以创建一个标签数组,而不是使用命名变量:

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()

现在,如果这是一个合适的应用程序,而不是一个游乐场,我可能只会在IB中添加带有@IBOutlet的堆栈视图,而不是以编程方式进行,但我只是想说明这个想法。

最新更新