因此,我有一个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个以上的自定义类型,因此它将变得难看。。
有没有办法用干净整洁的方法解决这个问题?我真的不喜欢冗余代码。
我认为最好的主意是将变量“属性”更改为协议,然后使用类实现此协议。
因此,作为解决方案,我制定了一个协议并在结构内部定义了该协议,但是我不得不使该结构不可编码,因为在我的情况下这不是问题,如果有问题,则可以使用init(from :)并使用编码键。