Каков правильный способ переопределить свойство в подклассе в Swift?
Я также наткнулся на этот вопрос, однако нет окончательного ответа
"Неоднозначное использование" propertyName"" ошибка с учетом переопределенного свойства с помощью наблюдателя didSet
Проблема: Я хотел бы переопределить свойство в подклассе.
Позвольте мне проиллюстрировать проблему с примером:
У меня есть класс под названием A
и его подкласс, называемый B
.
Класс A
class A {
var someStoredProperty : Int?
}
Класс B
class B : A{
override var someStoredProperty : Int?{
willSet{
//add to superclass setter
someStoredProperty = newValue! + 10
}
}
}
Как только я попытаюсь установить унаследованное свойство B
var b = B()
b.someStoredValue = 10 // Ambiguous use of someStoredProperty
компилятор говорит мне
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
}
}
}
Использование:
var switchRow = SwitchTableViewRow()
switchRow.clickAction = {
//^
//|
//|
//ambiguous use of clickAction
[unowned self, unowned switchRow] (tableView: UITableView, indexPath: NSIndexPath) in
//do something
}
Ответы
Ответ 1
Я не получаю эту ошибку в 6.1, но основная проблема заключается в том, что здесь у вас бесконечный цикл. Что вы хотели сказать:
// This is wrong, but what you meant
override var someStoredProperty: Int? {
willSet {
super.someStoredProperty = newValue! + 10
}
}
Обратите внимание на super
. (Это еще одна причина, по которой я настоятельно рекомендую использовать свойства self.
по свойствам, чтобы было ясно, когда эти бесконечные петли существуют.)
Но этот код не имеет смысла. Перед установщиком вы установите значение x + 10
. Затем вы устанавливаете значение x
. Что вы на самом деле имели в виду:
override var someStoredProperty: Int? {
didSet {
if let value = someStoredProperty {
super.someStoredProperty = value + 10
}
}
}