Ответ 1
Это работает для меня:
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)
не может быть помещен перед переопределенной переменной подкласса. Это может быть ошибка. А также я обманываю, чтобы убедиться, что сеттер производного класса ничего не делает.
Более распространенное использование 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"
будет в порядке.