объявить var как группу в swift - PullRequest
0 голосов
/ 08 ноября 2019

Я хочу объявить группу таких же объектов, как это.

var dave, paul, sam = UILabel()

Я пробовал разные вещи. Но я не смог сделать ничего другого, чтобы объявить переменные, кроме стандартных.

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

Я бы подумал, что должен быть какой-то способ поместить это в массив, чтобы ускорить процесс.

1 Ответ

1 голос
/ 08 ноября 2019

Вместо того, чтобы использовать именованные переменные, вы можете просто создать массив меток:

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 вместо того, чтобы делать это программно, но я просто хотел проиллюстрировать эту идею.

...