gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 16:01:30 24 4
gpt4 key购买 nike

我知道,继承 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

这崩溃了。它因为无法转换而崩溃 tempMyColor :

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/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com