我有一种情况需要覆盖属性的 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/