在Swift中压倒getter

时间:2015-04-30 15:17:05

标签: swift inheritance override getter-setter

我有一种情况需要覆盖属性的getter。

我们说我们有:

public class MyBaseClass {
    private var _name: String
    public internal(set) var name: String {
        get {
            return self._name
        }
        set {
            self._name = newValue
        }
    }
}

我想没什么好看的。

现在,如果我尝试覆盖派生类中的getter:

public class MyDerivedClass: MyBaseClass {
    public var name: String {
        get {
            return "Derived - \(super.name)"
        }
    }
}

我收到编译错误:无法使用只读属性' name' 覆盖mutable属性。

如果我尝试添加setter并覆盖它:

public class MyDerivedClass: MyBaseClass {
    public internal(set) var name: String {
        get {
            return "Derived - \(super.name)"
        }
        set {
            super.name = newValue
        }
    }
}

我收到错误:重写var的setter必须与它覆盖的声明一样可访问

如果我尝试以下方法:

public class MyDerivedClass: MyBaseClass {
    public internal(set) var name: String {
        get {
            return "Derived - \(super.name)"
        }
    }
}

然后,编译器崩溃了......

如何才能实现仅覆盖getter?

1 个答案:

答案 0 :(得分:25)

这对我有用:

    public class MyBaseClass {
        private var _name: String = "Hi"
        public internal(set) var name: String {
            get {
                return self._name
            }
            set {
                self._name = newValue
            }
        }
    }

    public class MyDerivedClass:MyBaseClass {
        override public var name: String {
            get {
                return "Derived - \(super.name)"
            }
            set {
                super._name = newValue
            }
        }
    }

    MyDerivedClass().name

修改

此代码适用于我在操场上,将其置于源代码中 - > SupportCode.swift文件

    public class MyBaseClass {
    private var _name: String = "Hi"
    public internal(set) var name: String {
        get {
            return self._name
        }
        set {
            self._name = newValue
        }
    }
    public init() {

    }

    }

    public class MyDerivedClass:MyBaseClass {
        override public var name: String {
            get {
                return "Derived - \(super.name)"
            }
            set {
               // do nothing
            }
        }
       public override init() {

        }
    }

这有点像一个混蛋,因为我得到的警告与internal(set)无法置于被覆盖的子类变量之前一样。这可能是一个错误。而且我也在作弊,以确保派生类的setter什么都不做。

internal(set)private(set)更常见的用法是使用与此类似的代码,类似于文档中的代码:

public class MyBaseClass {
    public private(set) var _name: String = "Hi"
    public var name: String {
        get {
            return self._name
        }
        set {
            self._name = newValue
        }
    }
    public init() {

    }

}

public class MyDerivedClass:MyBaseClass {
    override public var name: String {
        get {
            return "Derived - \(super.name)"
        }
        set {
           super._name = newValue
        }
    }
   public override init() {

    }
}

此处可以使用MyDerivedClass()._name直接读取设置器,但不能更改,例如这个MyDerivedClass()._name = "Fred"会引发错误,但MyDerivedClass().name = "Fred"会没问题。