【问题标题】:Override class variable declared in the superclass's extension in Swift覆盖在 Swift 中超类扩展中声明的类变量
【发布时间】:2019-10-15 01:40:51
【问题描述】:

是 Swift 5.0.1 还是 Xcode 的 bug?

这是在 Xcode 10.2.1 的操场上。

代码是:

extension UIColor {
    @objc class var myGolden: UIColor {
        return self.init(red: 1.000, green: 0.894, blue: 0.541, alpha: 0.900)
    }
}
print(UIColor.myGolden)

class MyUIColor: UIColor {
    override class var myGolden: UIColor {
        return super.init(red: 1.000, green: 0.894, blue: 0.541, alpha: 0.750)
    }
}
print(MyUIColor.myGolden)

playground 没有提示类MyUIColor有任何错误

输出是:

UIExtendedSRGBColorSpace 1 0.894 0.541 0.9

libc++abi.dylib:以 NSException 类型的未捕获异常终止

运行时错误提示:

错误:执行被中断,原因:信号 SIGABRT。过程 一直留在中断的地方,使用“线程 return -x" 返回表达式求值前的状态。

【问题讨论】:

  • 在 iOS 模拟器中测试的完整错误消息(可能有用):“*** 由于未捕获的异常 'NSInvalidArgumentException' 导致应用程序终止,原因:'+[iOSTest.MyUIColor initWithRed:green:blue: alpha:]: 无法识别的选择器发送到类 0x..."
  • @holex:除非我弄错了,否则这不是同一个问题。这里的属性在子类中被覆盖,而不是在扩展中。
  • 尽管我的回答解决了运行时错误,但您的代码为什么不起作用还不是很清楚。在类函数/计算属性内部,selfsuper 应该指代类/结构的类型,因此在您的情况下,self.initsuper.init 应该等同于 UIColor.init。此外,尝试等效代码但仅使用纯 Swift 类,一切正常。我想你可能在 Swift/Objective-C 桥接中发现了一个错误。

标签: swift uicolor


【解决方案1】:

问题不在于类变量覆盖,而是self.initsuper.init 的不当使用。您应该按如下方式更改代码:

extension UIColor {
    @objc class var myGolden: UIColor {
        return UIColor(red: 1.000, green: 0.894, blue: 0.541, alpha: 0.900)
    }
}
print(UIColor.myGolden)

class MyUIColor: UIColor {
    override class var myGolden: UIColor {
        return UIColor(red: 1.000, green: 0.894, blue: 0.541, alpha: 0.750)
    }
}
print(MyUIColor.myGolden)

【讨论】:

    【解决方案2】:

    self.initsuper.init 调用更改为UIColor.init 可以解决此问题。在计算属性或任何其他函数中创建类的实例时,您应该只分别从便利初始化程序或子类初始化程序调用 self.initsuper.init,您应该使用类型名称而不是 @987654326 调用 init 方法@ 或super

    extension UIColor {
        @objc class var myGolden: UIColor {
            return UIColor(red: 1.000, green: 0.894, blue: 0.541, alpha: 0.9)
        }
    }
    print(UIColor.myGolden)
    
    class MyUIColor: UIColor {
        override class var myGolden: UIColor {
            return UIColor(red: 1.000, green: 0.894, blue: 0.541, alpha: 0.75)
        }
    }
    print(MyUIColor.myGolden)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-08-19
      • 2023-03-22
      • 1970-01-01
      • 2017-11-20
      • 1970-01-01
      • 2018-09-14
      • 2012-05-05
      相关资源
      最近更新 更多