Подтвердить что ты не робот

Каков правильный способ переопределить свойство в подклассе в 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

}
4b9b3361

Ответ 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
        }
    }
}