在Swift 5中如何遍历作为结构项的标签

问题描述

我有一个带有标签的结构;

struct InfoLabels {
    var info0 = UILabel()
    var info1 = UILabel()
    var info2 = UILabel()
}

var infoLabels: [InfoLabels] = []

需要时,我们会添加标签显示在屏幕上。

像这样增加标签编号并在处添加它们以进行查看。 为了简单起见,这里没有显示标签的设置位置等。

infoLabels.append(InfoLabels()) 

当我不需要它们时,就是这样将它们从视图中删除的方式;

for k in 0..< infoLabels.count {
    infoLabels[k].info0.removeFromSuperview()
    infoLabels[k].info1.removeFromSuperview()
    infoLabels[k].info2.removeFromSuperview()
}  

但是当我更深入地研究原型应用程序时,信息标签数量增加并被删除 从这样的角度来看是不可行的。

我需要找到一种方法来遍历诸如info0,info1,...,infon之类的信息标签。 我看到使用镜像用法遍历结构项,但不适用于UILabel;

这不起作用;

let mirroredLabel = Mirror(reflecting: infoLabels)
    
    
for item in mirroredLabel.children  
        item.label.removeFromSuperview()
  }
    

解决方法

为什么不

struct InfoLabels {
    var count: Int
    var labels: [UILabel] = []

    init(_ count: Int) {
        self.count = count 
        labels = Array(repeating: UILabel,count: count)
    }
}

然后

infoLabels.append(InfoLabels(3)) 

用于删除

infoLabels.labels.forEach { $0.removeFromSuperview() }
,

我没有找到答案,但是我发现我使它如此工作的错误;

for k in 0..< infoLabels.count {

   let mirroredLabel = Mirror(reflecting: infoLabels[k])       
     for label in mirroredLabel.children  {
        (label.value as! UILabel).removeFromSuperview()
    }

  }
,

您需要对InfoLabels结构使用反射。因此您的代码可能看起来像这样:

infoLabels.forEach {
    let mirroredLabel = Mirror(reflecting: $0)
    mirroredLabel.children.forEach { child in
        (child.value as? UILabel)?.removeFromSuperview()
    }
}