【问题标题】:Differentiating class from instance member with same name in Swift 3在 Swift 3 中将类与同名的实例成员区分开来
【发布时间】:2016-08-18 13:57:31
【问题描述】:

在 Swift 3 中如何区分实例成员和同名的类成员?现在通常在 Xcode 8 beta 5 中正常工作的方法会产生错误:

“静态成员'textColor'不能用于UITag类型的实例”

public class UITag : UILabel {

    static var textColor = UIColor.white

   override public init(frame: CGRect) {
        super.init(frame: frame)

        textColor = UITag.textColor /* error: static member cannot be used on instance of type UITag */
        text      = " not set "
   }
}

【问题讨论】:

  • 去除静电并尝试一次
  • 请注意,添加显式 self.textColor = UITag.textColor 没有帮助
  • @Anbu.Karthik:静态成员与实例成员不同。
  • 试试public var textColor = UIColor.whiteprivate var textColor = UIColor.white

标签: ios swift3


【解决方案1】:

这是一个奇怪的错误,我们可以讨论它是否是一个编译器错误,它实际上允许用一个静态变量隐藏一个非静态变量,但是请注意,拥有两个具有相同属性的属性绝对是糟糕的代码名称,一个静态的,一个非静态的,因为最后一个会影响前一个。可能defaultTextColor 会是一个更好的名字。

一个简单的解决方法是使用:

super.textColor = ...

【讨论】:

    【解决方案2】:

    好的,到目前为止我发现的唯一解决方法是显式转换 self 如下:

    (self as UILabel).textColor  = UITag.textColor
    

    【讨论】:

      【解决方案3】:

      textColor 是静态变量,不能更改。您只能将其值用作UITag.textColor

      super.textColor = UITag.textColor这基本上是再次调用父类的实例变量,类似于下面示例中的txtColor

      public class UITag : UILabel {
      
          static var textColor = UIColor.white
          var txtColor = UIColor.red
      
          override public init(frame: CGRect) {
              super.init(frame: frame)
      
              super.textColor = UITag.textColor
              txtColor = UITag.textColor
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-02-24
        • 1970-01-01
        • 1970-01-01
        • 2019-07-31
        • 1970-01-01
        • 2019-01-10
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多