我目前正在尝试创建UIColor
的子类,因为出于我的目的,我需要使用几个属性来丰富它。一旦尝试在子类上设置任何自定义属性,该应用就会崩溃,并抛出EXC_BAD_ACCESS
异常。这是预期的吗?我想念什么吗?
这是我尝试过的代码:
class MyColorClass: UIColor {
var customProperty: String!
convenience init(fromColor color: UIColor) {
self.init(cgColor: color.cgColor)
self.customProperty = "rgfgb" // crash
}
}
MyColorClass(fromColor: UIColor.black)
答案 0 :(得分:0)
所以,在深入研究之后,我发现了以下内容:
因此,似乎很难将UIColor
子类化,因为它是所谓的“类集群”的一部分。 This article很好地描述了它。
问题的要点在于,Apple内部有UIColor
的几个(私有)子类,而UIColor
本身被设计为抽象工厂类,它向您返回了一个具体的子类。苹果公司描述了所有here。因此,如果您将UIColor
子类化,则某些功能会丢失,因为它不能直接使用。
从理论上讲,可以创建类集群类的子类。 Apple在链接的文章中对此进行了描述。但是,这很痛苦,因为您需要实现UIColor
中的所有方法,并将对它们的调用转发到有效的UIColor
实例。另外,我无法设法使它与UIColor
一起使用,因为它的某些必需的初始化程序是在扩展中定义的,您无法覆盖。
因此,最简单的方法是只创建一个包装UIColor
属性的包装器类。这不能像子类那样优雅,因为您不能使用自定义类来代替UIColor
,但是它可以工作:
class MyColor {
var base: UIColor
....
}
let myColor = MyColor()
/* we can't use myColor as a UIColor, but have to use myColor.base instead */