重写超类中声明的类变量';Swift中的s扩展
它是Swift 5.0.1还是Xcode的bug 这是在Xcode 10.2.1的操场上 代码为: 扩展UIColor{ @objc类变量myGolden:UIColor{ 返回self.init(红色:1.000,绿色:0.894,蓝色:0.541,阿尔法:0.900) } } 打印(UIColor.myGolden) 类MyUIColor:UIColor{ 重写类var myGolden:UIColor{ 返回super.init(红色:1.000,绿色:0.894,蓝色:0.541,阿尔法:0.750) } } 打印(MyUIColor.myGolden) 操场未显示该类的任何错误重写超类中声明的类变量';Swift中的s扩展,swift,uicolor,Swift,Uicolor,它是Swift 5.0.1还是Xcode的bug 这是在Xcode 10.2.1的操场上 代码为: 扩展UIColor{ @objc类变量myGolden:UIColor{ 返回self.init(红色:1.000,绿色:0.894,蓝色:0.541,阿尔法:0.900) } } 打印(UIColor.myGolden) 类MyUIColor:UIColor{ 重写类var myGolden:UIColor{ 返回super.init(红色:1.000,绿色:0.894,蓝色:0.541,阿尔法
MyUIColor
输出为:
UIExtendedSRGBColorSpace 1 0.894 0.541 0.9
libc++abi.dylib:以NSException类型的未捕获异常终止
运行时错误显示:
错误:执行被中断,原因:信号SIGABRT。过程
在被中断的位置,使用“线程”
return-x“返回到表达式求值之前的状态
将
self.init
和super.init
调用更改为UIColor.init
可以解决此问题。在计算属性或任何其他函数中创建类的实例时,应使用类型名而不是self
或super
调用init方法,分别从方便的初始值设定项或子类初始值设定项调用self.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)
将
self.init
和super.init
调用更改为UIColor.init
可以解决此问题。在计算属性或任何其他函数中创建类的实例时,应使用类型名而不是self
或super
调用init方法,分别从方便的初始值设定项或子类初始值设定项调用self.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)
问题不在于类变量重写,而是不正确地使用了
self.init
和super.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)
问题不在于类变量重写,而是不正确地使用了
self.init
和super.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)
在iOS模拟器中测试的完整错误消息(可能有用):“***由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:”+[iOSTest.MyUIColor initWithRed:green:blue:alpha:::::未识别的选择器发送到类0x…”可能重复@holex:,除非我弄错了,否则这不是同一问题。在这里,属性在子类中被重写,而不是在扩展中被重写。即使我的答案解决了运行时错误,也不清楚代码为什么不能工作。在类函数/计算属性内部,
self
和super
应该引用类/结构的类型,因此在您的情况下,self.init
和super.init
应该等同于UIColor.init
。此外,尝试一个等价的代码,但只使用纯Swift类,这一切都很好。我想您可能在Swift/Objective-C桥接中发现了一个错误。在iOS模拟器中测试的完整错误消息(可能有用):***由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“+[iOSTest.MyUIColor initWithRed:green:blue:alpha::发送到类0x的无法识别的选择器…”@holex的可能重复:除非我弄错了,否则这不是同一个问题。在这里,属性在子类中被重写,而不是在扩展中被重写。即使我的答案解决了运行时错误,也不清楚代码为什么不能工作。在类函数/计算属性内部,self
和super
应该引用类/结构的类型,因此在您的情况下,self.init
和super.init
应该等同于UIColor.init
。此外,尝试一个等价的代码,但只使用纯Swift类,这一切都很好。我认为您可能在Swift/Objective-C桥接中发现了一个错误。