我知道,不建议将UIColor
子类化。苹果说
大多数开发人员无需继承UIColor
但是我愿意。我昨天发布的another question中提供了更多有关为什么原因的信息。
该特定问题已解决,但我遇到了另一个问题。
假设我有这个自定义颜色类:
class MyColor:UIColor{
convenience init(test:String){
self.init(red: 0, green: 0, blue: 0, alpha: 1)
}
}
//Then do this anywhere:
let myColor = MyColor(test: "test")
let temp:Any? = myColor
let c = temp as! MyColor
这崩溃了。由于无法将
temp
转换为MyColor
而崩溃:无法将类型'UIDeviceRGBColor'(0x ..)的值强制转换为'MyColor'(0x ..)
myColor
是MyColor
的实例。相同的实例存储在Any?
类型的变量中,然后强制转换回MyColor
。但是不能。不过,如果我将其转换为
UIColor
,则一切正常。但是我无法做到这一点(在上一个问题中已有解释)。为什么不起作用?
最佳答案
问题在于UIColor
被实现为所谓的类集群。这是一种类工厂,但是工厂在后台进行隐式工作。
在您的示例中,如果您要创建一个MyColor
实例,则内部发生的情况如下:
MyColor.init
调用 super class MyColor
更改为适合参数的形式,在您的情况下为UIDeviceRGBColor
。 UIColor.init
返回的实例与您要创建的实例不同。这是UIColor
的子类,但不再是MyColor
的子类。 在 objective-c 中,您可以更轻松地跟踪此行为:
UIColor *color = [UIColor alloc];
NSLog(@"Address after alloc: %p - class: %@", color, [color class]);
color = [color initWithRed:1.0, green:1.0, blue:1.0, alpha:1.0];
NSLog(@"Address after init: %p - class: %@", color, [color class]);
初始化器被调用后,您应该获得一个不同的地址和类。