在 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.white
或private 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 中将类与同名的实例成员区分开来的主要内容,如果未能解决你的问题,请参考以下文章