Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/99.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/17.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
Ios 在swift中重写fileprivate扩展中的open var时发出警告_Ios_Swift_Xcode_Uibutton - Fatal编程技术网

Ios 在swift中重写fileprivate扩展中的open var时发出警告

Ios 在swift中重写fileprivate扩展中的open var时发出警告,ios,swift,xcode,uibutton,Ios,Swift,Xcode,Uibutton,考虑以下几点 fileprivate extension UIButton { override open var isSelected: Bool { didSet { self.titleLabel?.font = isSelected ? UIFont(name: "HelveticaNeue-Medium", size: 14) : UIFont(name: "HelveticaNeue-Light", size: 14)

考虑以下几点

fileprivate extension UIButton {
    override open var isSelected: Bool {
        didSet {
            self.titleLabel?.font = isSelected ? UIFont(name: "HelveticaNeue-Medium", size: 14) : UIFont(name: "HelveticaNeue-Light", size: 14)
        }
    }
}
过了一会儿,xcode中会出现一条警告,要求我将“open”更改为fileprivate。当然,如果我这样做了,那么我不会重写UIButton中相同的
isSelected
变量,我会得到一个错误

这是一个XCode错误吗?我无法公开或内部扩展,因为该行为将改变应用程序中的所有
ui按钮。
有什么想法吗

更新:

确切的警告是这样的。
有趣的是,斯威夫特实际上让你这么做。我相信这是有意的,您不能在private(fileprivate)上下文中重写公共方法

这与您真正想要的是不明确的:

在本例中,您在上下文中重写该方法,该方法只作用于文件本身。有人可能会认为覆盖仅适用于此文件中的按钮,但事实并非如此。现在,应用程序中的每个按钮实际上都覆盖了该方法(我们已经对其进行了测试)。因此,您的解决方案肯定是在公开的扩展中重写此方法


注意:我知道它是一个属性,而不是一个方法,但在幕后,这是一个在调用对象上的setter后触发的方法。

有趣的是,Swift实际上允许您这样做。我相信这是有意的,您不能在private(fileprivate)上下文中重写公共方法

这与您真正想要的是不明确的:

在本例中,您在上下文中重写该方法,该方法只作用于文件本身。有人可能会认为覆盖仅适用于此文件中的按钮,但事实并非如此。现在,应用程序中的每个按钮实际上都覆盖了该方法(我们已经对其进行了测试)。因此,您的解决方案肯定是在公开的扩展中重写此方法


注意:我知道这是一个属性,而不是一个方法,但在幕后,这是一个在调用对象上的setter后触发的方法。

您得到的确切警告是什么?声明完全有效,它可以按预期工作。警告是错误的。警告消息是错误的,因为编译器的消息文件中存在错误,它应该是“在fileprivate扩展中声明OPEN var”,有关类似问题,请参阅。作为一种解决方案,您可以从
扩展名
中删除
fileprivate
。您得到的确切警告是什么?声明完全有效,并按预期工作。警告是错误的。警告消息是错误的,因为编译器的消息文件中存在错误,它应该是“在fileprivate扩展中声明OPEN var”,有关类似问题,请参阅。作为一种解决方案,您可以从
扩展中删除
fileprivate
。我的脑子都快炸开了。它确实无处不在!那么为什么会存在fileprivate扩展?@L\u Sonic不支持覆盖。它用于子类化或创建fileprivate类。甚至不适用于公共协议实现。在您的案例中使用子类。另外,让我与您分享一个您很少看到的建议:当涉及到对非您的类(如UIButton)进行扩展时,请不惜一切代价避免!说真的,永远不要这样做,除非真的没有其他方法来产生你的解决方案。似乎比仅仅为了改变字体而子类化整个类更干净。谢谢你的建议@L_Sonic我觉得你在这一点上,但不幸的是,这些事情不是这样工作的。但是,如果他们只是问你自己一件事:扩展什么时候才能真正起作用?如果按钮是在此文件中创建的?如果在此文件中调用了setter?是否在此文件中使用了按钮实例?在一般情况下,我的做法是有一个按钮的自定义子类,然后在整个应用程序中使用。然后,您可以轻松地添加其他属性或逻辑。你甚至可以在IB中添加IB可检查项来控制它们。我的心都碎了。它确实无处不在!那么为什么会存在fileprivate扩展?@L\u Sonic不支持覆盖。它用于子类化或创建fileprivate类。甚至不适用于公共协议实现。在您的案例中使用子类。另外,让我与您分享一个您很少看到的建议:当涉及到对非您的类(如UIButton)进行扩展时,请不惜一切代价避免!说真的,永远不要这样做,除非真的没有其他方法来产生你的解决方案。似乎比仅仅为了改变字体而子类化整个类更干净。谢谢你的建议@L_Sonic我觉得你在这一点上,但不幸的是,这些事情不是这样工作的。但是,如果他们只是问你自己一件事:扩展什么时候才能真正起作用?如果按钮是在此文件中创建的?如果在此文件中调用了setter?是否在此文件中使用了按钮实例?在一般情况下,我的做法是有一个按钮的自定义子类,然后在整个应用程序中使用。然后,您可以轻松地添加其他属性或逻辑。您甚至可以添加IB可检查项以在IB中控制它们。