swift - 在 Swift 中覆盖 getter

标签 swift inheritance overriding 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)"
        }
    }
}

我收到编译错误:无法使用只读属性“名称”覆盖可变属性

如果我尝试添加 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 ?

最佳答案

这对我有用:

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

编辑

这段代码在 Playground 上对我有用,将它放在 Sources -> 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() {

    }
}

这里的 setter 可以直接用 MyDerivedClass()._name 读取,但不能更改,例如这个 MyDerivedClass()._name = "Fred" 会引发错误,但 MyDerivedClass().name = "Fred" 没问题。

关于swift - 在 Swift 中覆盖 getter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29971528/

相关文章:

xcode - 在 swift sprite 工具包中创建菜单

ios - 方法不能声明为 public,因为它的参数使用内部类型

java - 覆盖父类(super class)的 protected 方法

javascript - 扩展 Array 类时如何覆盖构造函数?

java - 引用的类类型和实际的类类型,哪个决定调用哪个方法?

C++ 多态性和覆盖

pod 更新到 3.4.1 后 xcode 8 beta Alamofire 编译器错误

javascript - 如何继承和链接String而不污染String.prototype?

c++ - 如何为可覆盖方法提供默认实现?

几个月后 iPhone 应用程序崩溃