前端之家收集整理的这篇文章主要介绍了
覆盖Swift的吸气剂,
前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
@H_
403_0@
我有一种情况,我需要覆盖一个
属性的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)"
}
}
}
然后,编译器崩溃…
如何才能实现仅覆盖吸气剂?
这对我有用:
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() {
}
}
这是一个风筝,因为我得到相同的警告,因为内部(集)不能被放置在被覆盖的子类变量之前。这可能是一个bug。而且我也在欺骗,以确保派生类的setter没有任何作用。
内部(集)或私有(集)的更常见的用法是使用类似于文档中的代码:
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”将会OK。