我有一种情况需要覆盖属性的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?
答案 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"
会没问题。