Ios 如何使用Xcode 6.3 Beta2覆盖Swift中超类的setter?
我的SuerClass是Ios 如何使用Xcode 6.3 Beta2覆盖Swift中超类的setter?,ios,swift,inheritance,overriding,uicollectionviewcell,Ios,Swift,Inheritance,Overriding,Uicollectionviewcell,我的SuerClass是UICollectionViewCell,它有一个属性: var selected: Bool 我的班级是 MyClass : UICollectionViewCell { func setSelected(selected: Bool) { super.selected = selected // do something } } 前者在Xcode 6.2中运行良好,但在Xcode 6.3Beta2中,它会引发一个错误: 方法“setSe
UICollectionViewCell
,它有一个属性:
var selected: Bool
我的班级是
MyClass : UICollectionViewCell {
func setSelected(selected: Bool) {
super.selected = selected
// do something
}
}
前者在Xcode 6.2中运行良好,但在Xcode 6.3Beta2中,它会引发一个错误:
方法“setSelected”与Objective-C选择器“setSelected:”与具有相同Objective-C选择器的超类“UICollectionViewCell”中“selected”的setter冲突
如何解决此问题,使其与Xcode 6.3 beta2一起工作?
编辑:我也试过:
override func setSelected(selected: Bool) {
super.selected = selected
// do something
}
这会导致错误:
方法不重写其超类中的任何方法
如果我们希望它在设置
选定的
属性后执行一些额外的功能,我们可以简单地覆盖以添加属性观察者:
override var selected: Bool {
didSet {
if self.selected {
// do something
}
}
}
Swift 5的最新答案:
override var isSelected: Bool {
didSet {
if self.isSelected {
// do something
}
}
}
如果我们关心所选的上一个值是什么,我们可以通过oldValue
访问它:
didSet {
if self.selected == oldValue {
return
}
// do something
}
Swift 5的最新答案:
didSet {
if self.isSelected == oldValue {
return
}
// do something
}
别忘了,如果我们需要在更改值之前做些什么,我们也可以使用willSet
我很好奇,当我们有一个大的类层次结构,每个类都在willSet
和didSet
属性观察器中添加自己的东西时,会发生什么,所以我创建了以下测试:
class ClassA {
var _foo: Int = 0
var foo: Int {
set(newValue) {
println("Class A setting foo")
self._foo = newValue
}
get {
return self._foo
}
}
}
class ClassB: ClassA {
override var foo: Int {
willSet {
println("Class B will set foo")
}
didSet {
println("Class B did set foo")
}
}
}
class ClassC: ClassB {
override var foo: Int {
willSet {
println("Class C will set foo")
}
didSet {
println("Class C did set foo")
}
}
}
现在,如果我们创建一个ClassC
对象并设置其foo
属性:
var c: ClassC = ClassC()
c.foo = 42
我们得到以下输出:
C类将设置foo
B班将设置foo
甲级设置foo
B班的学生确实有福气
C班确实设置了foo
所以,重要的是要注意以下几点
- 子类的
willSet
在其父类的willSet
之前调用
- 子类的
didSet
在其父类的didSet
之后被称为
- 为添加属性观察者而创建重写不会替换父类中的任何属性观察者
前两点有点道理。事实上,这使得房地产观察家更具吸引力。斯威夫特有效地迫使我们的手以适当的方式在继承权上下移动,并很好地将其分为两种不同的方法。Swift还防止我们(我相信)重写父类的属性,但仍然允许我们观察对该属性的更改——这比Objective-C的方法要好得多
但第三点可能是最重要的。小心——你很容易陷入didSet
和willSet
代码的大规模继承权中,这会减慢一个非常快速的过程:设置属性的值。你使用了overrides
关键字吗?您是否尝试将其作为属性重写?@nhgrifoverride
无效请参见我的编辑。