Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
重写超类中声明的类变量';Swift中的s扩展_Swift_Uicolor - Fatal编程技术网

重写超类中声明的类变量';Swift中的s扩展

重写超类中声明的类变量';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,阿尔法

它是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) 操场未显示该类的任何错误
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桥接中发现了一个错误。