在 UIColor 子类中设置 属性 时崩溃

Crash when setting property in UIColor subclass

我目前正在尝试创建 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)

游乐场示例:https://ufile.io/ejmrwst4

所以在仔细研究之后,我发现了以下内容:

发生了什么

所以似乎不太可能subclass UIColor,因为它是所谓的"class cluster"的一部分。 This article 描述的真好。

事情的要点是,在内部,Apple 有几个 UIColor 的(私有)子class,并且 UIColor 本身被设计为一个抽象工厂 class 哪个 returns 具体子 class 之一给你。 Apple 描述了这一切 here。因此,如果您使用 subclass UIColor,则会缺少某些功能,因为它并非设计为直接使用。

解决方案

理论上,可以创建 class 集群 class 的子 class。 Apple 在链接的文章中对此进行了描述。但是,这很痛苦,因为您需要实现 UIColor 中的所有方法并将对它们的调用转发到有效的 UIColor 实例。此外,我无法设法让它与 UIColor 一起使用,因为它的一些必需的初始化器是在扩展中定义的,你不能覆盖它。

因此,最简单的方法就是创建一个包装器 class,它包装 UIColor 属性。这不像 subclass 那样优雅,因为您不能使用自定义 class 代替 UIColor,但它有效:

class MyColor {

    var base: UIColor

    ....
}

let myColor = MyColor()
/* we can't use myColor as a UIColor, but have to use myColor.base instead */