在 Swift 3 中将类与同名的实例成员区分开来

Posted

技术标签:

【中文标题】在 Swift 3 中将类与同名的实例成员区分开来【英文标题】:Differentiating class from instance member with same name in 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 【参考方案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
    

【讨论】:

以上是关于在 Swift 3 中将类与同名的实例成员区分开来的主要内容,如果未能解决你的问题,请参考以下文章

java中的成员变量、类变量,成员方法、类方法各是啥,怎么区分,

java类与对象_成员变量和局部变量区别

Java基础之抽象类与接口

2017/03/19学习笔记

3-7:类与对象下篇——static成员

类与对象