【发布时间】: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:除非我弄错了,否则这不是同一个问题。这里的属性在子类中被覆盖,而不是在扩展中。
-
尽管我的回答解决了运行时错误,但您的代码为什么不起作用还不是很清楚。在类函数/计算属性内部,
self和super应该指代类/结构的类型,因此在您的情况下,self.init和super.init应该等同于UIColor.init。此外,尝试等效代码但仅使用纯 Swift 类,一切正常。我想你可能在 Swift/Objective-C 桥接中发现了一个错误。