在Swift中覆盖子类中的属性的正确方法是什么?

the*_*tic 10 inheritance overriding properties ios swift

我也偶然发现了这个问题,但没有明确的答案

使用didSet观察者给出覆盖属性的"不明确使用'propertyName'"错误

问题:我想覆盖子类中的属性.

让我用一个例子说明问题:

我有一个叫做的类A和一个叫它的子类B.

A级

class A {

    var someStoredProperty : Int? 

}
Run Code Online (Sandbox Code Playgroud)

B级

class B : A{

    override var someStoredProperty : Int?{

        willSet{

            //add to superclass's setter 
            someStoredProperty = newValue! + 10
        }

    }

}
Run Code Online (Sandbox Code Playgroud)

一旦我尝试设置继承属性 B

var b = B()
b.someStoredValue = 10 // Ambiguous use of someStoredProperty
Run Code Online (Sandbox Code Playgroud)

编译告诉我

Ambiguous use of someStoredProperty

这是为什么 ?

更新

class TableViewRow{

    typealias ClickAction = (tableView:UITableView, indexPath:NSIndexPath) -> Void
    var clickAction : ClickAction?
}

class SwitchTableViewRow: TableViewRow {

    override var clickAction : ClickAction? {

        didSet{

            //override setter
        }

    }

}
Run Code Online (Sandbox Code Playgroud)

用法:

var switchRow = SwitchTableViewRow()
switchRow.clickAction = {    
       //^
       //|
       //|
 //ambiguous use of clickAction
[unowned self, unowned switchRow] (tableView: UITableView, indexPath: NSIndexPath) in

    //do something

}
Run Code Online (Sandbox Code Playgroud)

Rob*_*ier 12

我在6.1中没有得到那个错误,但潜在的问题是你在这里有一个无限循环.你的意思是:

// This is wrong, but what you meant
override var someStoredProperty: Int? {
    willSet {
        super.someStoredProperty = newValue! + 10
    }
}
Run Code Online (Sandbox Code Playgroud)

请注意super.(这是我强烈建议self.在属性上使用的另一个原因,以便在存在这些无限循环时明确.)

但是这段代码毫无意义.在设置器之前,将值设置为x + 10.然后将值设置为x.你真正的意思是:

override var someStoredProperty: Int? {
    didSet {
        if let value = someStoredProperty {
            super.someStoredProperty = value + 10
        }
    }
}
Run Code Online (Sandbox Code Playgroud)