我在Swift中制作了一个UIButton子类,以在选择时执行自定义绘图和动画
Swift - (void)setSelected:(BOOL)selected
中的ObjC中的覆盖相当于什么?
我试过了
override var selected: Bool
所以我可以实现一个观察者,但是我得到
Cannot override with a stored property 'selected'
像其他提到的一样,您可以使用它willSet
来检测更改。但是,在替代中,您不需要将值分配给super,而只是观察现有的更改。
您可以从以下游乐场观察到几件事:
willSet/didSet
仍会为调用super get/set
。您可以知道,因为状态从.normal
变为.selected
。selected
无论是newValue
在willSet
或oldValue
在didSet
确定是否要动画。 import UIKit
class MyButton : UIButton {
override var isSelected: Bool {
willSet {
print("changing from \(isSelected) to \(newValue)")
}
didSet {
print("changed from \(oldValue) to \(isSelected)")
}
}
}
let button = MyButton()
button.state == .normal
button.isSelected = true // Both events fire on change.
button.state == .selected
button.isSelected = true // Both events still fire.
问题内容: 我正在尝试使用Swift协议扩展,却发现这种行为令人困惑。您能帮我得到我想要的结果吗? 请参阅代码最后4行的注释。(如果需要,可以将其复制粘贴到Xcode7游乐场)。谢谢!! 问题答案: 简短的答案是协议扩展不执行类多态性。这是有一定道理的,因为协议可以被结构或枚举采用,并且因为我们不希望仅在没有必要的地方采用协议来引入动态调度。 因此,在中,实例变量(可能更准确地写为)并不意味着您认
问题内容: 我注意到编译器不会让我用另一个存储的值覆盖存储的属性(这似乎很奇怪): 但是,我可以使用计算属性来执行此操作: 为什么不允许我再给它一个值? 为什么用存储的属性覆盖是可憎的,而要使用计算的一个犹太洁食呢?他们在想什么呢? 问题答案: 为什么不允许我再给它另一个值? 绝对可以为继承的属性赋予不同的值。如果您在采用该初始值的构造函数中初始化属性,然后传递与派生类不同的值,则可以执行此操作:
问题内容: 是否有一种标准方法可以在Swift中制作“纯虚函数”,即。一个 必须 由每个子类中被覆盖,并且,如果不是的话,将导致编译时错误? 问题答案: 您有两种选择: 将超类定义为协议而不是类 Pro :编译时检查每个“子类”(不是实际的子类)是否实现了所需的方法 缺点 :“超类”(协议)无法实现方法或属性 2.声明该方法的超级版本 例: Pro :可以在超类中实现方法和属性 缺点 :不检查编译
问题内容: 我们很少有扩展基本类的类。我们注意到我们使用了“退出一些睡眠”方法,并且希望在发生睡眠时进行记录。有没有一种方法可以覆盖Thread.sleep方法,在其中我可以添加一些自定义逻辑(即记录),然后仅调用实际的Thread.sleep()?这样,我就不必更改在我的基类中使用Thread.sleep的所有位置。我也愿意接受其他选择。 问题答案: 您不能重写方法,因为它是本机方法,所以无法对
我正在开发一个Spring集成/引导应用程序。我正在使用一个多文档(src/main/Resources/application.yml)来设置几个配置类的默认值(用@ConfigurationProperties注释)。pplicaiton.yml带有默认值,其中一些需要被覆盖,具体取决于环境。 我可以在目录中使用Java系统属性(-D...=...)、Spring“属性”(--...=...)
问题内容: 我试图在php中覆盖我的位置,但是我仍然在php.ini文件中获得了2 mb的值。 问题答案: 通过进行设置时,这些设置不会有任何效果。 原因是PHP 在 执行脚本 之前 需要这些值。上载时,将在完成上载后执行目标脚本,因此PHP需要事先知道最大大小。 在,虚拟主机配置或文件中进行设置。一个典型的文件如下所示: