Переопределение свойств в быстрых
Например, 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
//}
}
}