ios - 从 Any 转换时 UIColor 子类崩溃?

标签 ios swift xcode uikit uicolor

我知道,不建议对 UIColor 进行子类化。苹果说

Most developers have no need to subclass 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:

Could not cast value of type 'UIDeviceRGBColor' (0x..) to 'MyColor' (0x..)

myColorMyColor 的实例。这个相同的实例存储在 Any? 类型的变量中,然后转换回 MyColor。但它不能。

但是,如果我将其转换为 UIColor 一切正常。但就我而言,我不能这样做(在上一个问题中已解释)。

为什么这不起作用?

最佳答案

问题在于 UIColor 是作为所谓的类簇实现的。这是一种类工厂,但工厂在幕后隐式工作。 在您的示例中,如果您打算创建一个 MyColor 实例,则内部发生的情况如下:

  • MyColor.init 调用父类(super class)的初始化器
  • 然后,父类(super class)委托(delegate)给内部类工厂,并将具体实现从 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]);

调用初始化程序后,您应该获得不同的地址和类。

关于ios - 从 Any 转换时 UIColor 子类崩溃?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59747840/

相关文章:

ios - Firebase 身份验证密码重置 iOS Swift - 更新 Firebase 数据库

ios - AES/cbc/pkcs5padding加密IOS

Swift UI 文本填充与空格不一致

ios - swift NSManagedObject 子类初始化问题

ios - 如何更改 AVPlayer 视频的速率

ios - YouTube API : clang: error: linker command failed with exit code 1 (use -v to see invocation)

android - 如何删除React Native上的所有应用程序数据?

ios - 显示动画并锁定当前 View

ios - 获取 json 响应但无法解析为标签

ios - objective-c -播放相同声音时,8个按钮中的2个应该消失