iOS- Swift动态UIViewController与多个自定义定义的属性类型一起使用

问题描述 投票:1回答:2

因此,我有一个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个以上的自定义类型,因此它将变得难看。。

有没有办法用干净整洁的方法解决这个问题?我真的不喜欢冗余代码。

ios swift generics dynamic swift-protocols
2个回答
0
投票

我认为最好的主意是将变量“属性”更改为协议,然后使用类实现此协议。


0
投票

因此,作为解决方案,我制定了一个协议并在结构内部定义了该协议,但是我不得不使该结构不可编码,因为在我的情况下这不是问题,如果有问题,则可以使用init(from :)并使用编码键。

© www.soinside.com 2019 - 2024. All rights reserved.