Переопределение свойств в быстрых

Например, a имеет первый класс

public class MyBaseButton: UIButton {

    public var weight: Double = 1.0

    public var text: String? {
        get {
            return self.titleForState(.Normal)
        }
        set {
            return self.setTitle(newValue, forState: .Normal)
        }
    }
}

И унаследованный класс:

public class SomeButton: SomeBaseButton {

    override public var text: String? = "text"
    override public var weight: Double = 2.0
}

Итак, логика заключается в том, что SomeClass определяет собственный текст и вес. Но я получаю ошибки:

Для текста: "Нельзя переопределить с сохраненным свойством" текст "

Для веса: "Нельзя переопределить с сохраненным свойством" вес "

Ответ 1

Интересно, что это прекрасно работает в чистых классах Swift. Например, это работает как ожидалось:

public class FooButton {
    public var weight: Double = 1.0
}

public class BarButton: FooButton {
    override public var weight: Double = 2.0
}

Причина, по которой он не работает для вас, заключается в том, что вы работаете с классами Objective-C: поскольку UIButton является классом Objective-C, все его подклассы тоже будут. Из-за этого правила кажутся немного разными.

Xcode 6.3 на самом деле немного информативнее. Он показывает следующие две ошибки:

Getter для "веса" переопределяет Objective-C метод "вес" из суперкласса "FooButton" Setter для "weight" переопределяет метод Objective-C "setWeight:" из суперкласса "Foobutton"

Так как следующее работает...

public class BarButton: FooButton {
    override public var weight: Double {
        get {
            return 2.0
        }
        set {
            // Do Nothing
        }
    }
}

... я предполагаю, что эти методы просто не синтезируются правильно.

Интересно, это ошибка компилятора. Или недостаток. Потому что я думаю, что это может справиться с этим случаем.

Возможно, дизайнеры Swift полагали, что в случае переопределения weight вы также можете просто установить его в другое значение в своем инициализаторе. Hm.

Ответ 2

Кроме того, если кто-то хочет переопределить свойство, чтобы иметь эффект dynamic, см. KVO

class MyClass: NSObject {
    var date = NSDate()
}

class MyChildClass: MyClass {
    dynamic override var date: NSDate {
        get { return super.date }
        set { super.date = newValue }
    }
}

Ответ 3

В приведенном выше примере у вас есть геттер и сеттер.

Когда вы переопределяете его, вы просто назначаете ему значение.

Вместо этого настройте сеттер и геттер, как вы уже выше.

var _text:Text

   override public var text: String? {
            get {
                return _text
            }
            set {
                _text = newValue
            }
        }

Ответ 4

Я столкнулся с этой проблемой при попытке переопределить свойство NSPredicateRowEditor templateViews в Swift 3.

Свойство суперкласса для переопределения:

open var templateViews: [NSView] { get }

Заменить так:

class CustomRowTemplate: NSPredicateEditorRowTemplate {

    override var templateViews: [NSView] {
        get {
            let templateViews = super.templateViews

            // custom subclass work goes here

            return templateViews
        }
        //set {

        // Superclass property is `get` only, other properties might need a setter

        //}
    }

}