Overriding properties in swift

前端 未结 4 1330
忘了有多久
忘了有多久 2020-12-25 10:41

For example a have a first class

public class MyBaseButton: UIButton {

    public var weight: Double = 1.0

    public var text: String? {
        get {
            


        
相关标签:
4条回答
  • 2020-12-25 11:13

    In the above you have a getter and a setter.

    When you override it, you are just assigning it a value.

    Instead set up the setter and getter as you have above.

    var _text:Text
    
       override public var text: String? {
                get {
                    return _text
                }
                set {
                    _text = newValue
                }
            }
    
    0 讨论(0)
  • 2020-12-25 11:16

    In addition, if someone wants to override property to have dynamic effect, see KVO

    class MyClass: NSObject {
        var date = NSDate()
    }
    
    class MyChildClass: MyClass {
        dynamic override var date: NSDate {
            get { return super.date }
            set { super.date = newValue }
        }
    }
    
    0 讨论(0)
  • 2020-12-25 11:24

    Interestingly this works just fine in pure Swift classes. For example, this works as expected:

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

    The reason it does not work for you is because you are working with Objective-C classes: since UIButton is an Objective-C class, all its subclasses will be too. Because of that, the rules seem to be a bit different.

    Xcode 6.3 is actually a bit more informative. It shows the following two errors:

    Getter for "weight" overrides Objective-C method "weight" from superclass "FooButton" Setter for "weight" overrides Objective-C method "setWeight:" from superclass "Foobutton"

    Since the following does work ...

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

    ... my guess is that these methods are simply not synthesized correctly.

    I wonder if this is a compiler bug. Or a shortcoming. Because I think it could handle the case.

    Maybe the Swift designers thought that in case of overriding weight you could also simply set it to a different value in your initializer. Hm.

    0 讨论(0)
  • 2020-12-25 11:37

    I ran into this issue when trying to override the NSPredicateRowEditor templateViews property in Swift 3.

    Superclass property to override:

    open var templateViews: [NSView] { get }
    

    Override like so:

    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
    
            //}
        }
    
    }
    
    0 讨论(0)
提交回复
热议问题