Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/101.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/19.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 如何使用Xcode 6.3 Beta2覆盖Swift中超类的setter?_Ios_Swift_Inheritance_Overriding_Uicollectionviewcell - Fatal编程技术网

Ios 如何使用Xcode 6.3 Beta2覆盖Swift中超类的setter?

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

我的SuerClass是
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
关键字吗?您是否尝试将其作为属性重写?@nhgrif
override
无效请参见我的编辑。