Итак, у меня есть ViewController с атрибутом типа «Something», этот же контроллер представления, который я хочу использовать с другим атрибутом типа «something1», я думал о создании протокола для каждого настраиваемого типа «something» "и" something1 ", и они доставляют то, что мне нужно, внутри ViewController, но оба являются структурами, и они не будут работать, поскольку оба являются типами значений.
мой примерный код следующий:
final class DynamicViewController: UIViewController {
private let attribute: CustomType // something or Somthing1
private let stackView: UIStackView
init(attribute: CustomType) {
self.attribute = attribute
super.init(nibName: nil, bundle: nil)
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
override func viewDidLoad() {
super.viewDidLoad()
setupViews()
}
private func setupViews() {
let scrollView = UIScrollView()
scrollView.translatesAutoresizingMaskIntoConstraints = false
view.addSubview(scrollView)
NSLayoutConstraint.activate ([
...
])
scrollView.addSubview(stackView)
NSLayoutConstraint.activate([
...
])
getInfoLabels()
}
private func getInfoLabels() {
if let attribute = attribute {
numerateInObjectAndGetLabel(obj: attribute)
}
}
private func numerateInObjectAndGetLabel(obj: Any) {
let mirroredAttr = Mirror(reflecting: obj)
for (_, attr) in mirroredAttr.children.enumerated() {
if let txts = attr.value as? [String] {
for txt in txts {
stackView.addArrangedSubview(getLabel(for: txt))
}
}
}
}
private func getLabel(for text: String) -> UILabel {
let label = UILabel()
....
return label
}}
У меня есть решение сделать несколько дополнительных атрибутов с несколькими настраиваемыми типами, но в моем случае у меня более 10 настраиваемых типов, поэтому он будет некрасивым.
Есть ли способ решить эту проблему с помощью аккуратный и чистый подход? Мне очень не нравится избыточный код.