gpt4 book ai didi

swift - 在 Swift 中覆盖 getter

转载 作者:IT王子 更新时间:2023-10-29 05:06:12 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com