【问题标题】:use a for loop for 2 different types对 2 种不同类型使用 for 循环
【发布时间】:2021-07-11 02:59:24
【问题描述】:
我希望我的 swift 代码使用带有标签和文本字段的 for 循环。问题是我下面的代码不起作用。如果它是所有文本字段或标签,它会起作用,但混合类型不起作用。我只是想知道是否有某种方法可以组合不同的类型并使其在一个循环下工作。
var name = UILabel()
var age = UITextField()
for i in [name,age] {
i.textAlignment = .center
}
【问题讨论】:
标签:
swift
for-loop
types
casting
【解决方案1】:
我只是想知道是否有某种方法可以组合不同的类型并使其在一个循环下工作。
当然。有一种标准技术。
您要做的是循环遍历具有可设置textAlignment 属性的视图数组。要使 UILabel 和 UITextField 成为该类型,请将类型声明为具有该属性的协议,并使 UILabel 和 UITextField 符合它。
现在您可以按照 Swift 的需要将 UILabel 和 UITextField 实例组成一个相同类型的数组,然后循环遍历它:
protocol Alignable : UIView {
var textAlignment : NSTextAlignment {get set}
}
extension UILabel : Alignable {}
extension UITextField : Alignable {}
let name = UILabel()
let age = UITextField()
for i in [name, age] as [Alignable] {
i.textAlignment = .center
}
编译器允许这样做,因为您已经通过协议向它展示了您尝试执行的操作(即分配给数组中每个事物的textAlignment 属性)是可能的。你是说:“嘿,编译器,我知道 UITextField 和 UILabel 看起来没有太多共同点,但可以将它们完全视为具有可设置 textAlignment 属性的东西,仅此而已。”