如何在swift中将一个类类型实例分配给另一个类类型引用以应用动态多态

时间:2016-01-02 12:45:38

标签: swift2

我无法在运行时为标签设置backgroundcolor

func example() {
  let lbl: UILabel = UILabel()
  let arrTemp: NSMutableArray = NSMutableArray()
  arrTemp.addObject(lbl)
  let tempButton: UIButton? = arrTemp.objectAtIndex(0) as? UIButton
  tempButton.backgroundColor = UIColor.whiteColor()
}

3 个答案:

答案 0 :(得分:1)

由于多种原因,你的逻辑是错误的。 让我们看看你在做什么

  1. 您正在向UILabel添加arrTemp

    arrTemp.addObject(lbl)
    
  2. 现在arrTemp确实包含UILabel作为唯一元素

    1. 接下来,您将检索arrTemp的第一个元素并尝试将其强制转换为UIButton

      let tempButton: UIButton? = arrTemp.objectAtIndex(0) as? UIButton
      
    2. 当然,条件转换将始终失败(给定当前代码)并且tempButton将填充nil

      1. 您正在访问tempButton的属性(这是一个可选值)而不解包它。编译的Swift不允许你这样做。

        tempButton.backgroundColor = UIColor.whiteColor()
        
      2. 您可以更新最后一行以使编译器满意

        tempButton?.backgroundColor = UIColor.whiteColor()
        
      3. 但由于tempButton始终为nil,因此永远不会执行最后一项作业。

        现在有一个问题:你想做什么?您希望将UILabel放入数组,然后尝试将该标签用作UIButton

答案 1 :(得分:0)

您只能将对象引用为实际的对象。否则,您可以使用无类型数组向标签询问其buttonType,而不会出现编译时错误。

如果您不想要这种类型的安全,Objective-C可能是更好的选择。

答案 2 :(得分:0)

UILabelUIView的子类; UIView的可设置属性为backgroundColor。因此,要简单地设置UILabel颜色:

func example() {
  let lbl: UILabel = UILabel()
  lbl.backgroundColor = UIColor.whiteColor()
  // do something with lbl.
}