Переменная 'xxx' никогда не изменялась; в производном классе
Я публикую свое первое сообщение здесь, у меня есть логичный вопрос о быстром языке. К вашему сведению, я довольно новичок в стремительном языке, я использую код на C++, и мне немного сложно иметь объективную точку зрения на то, как все делать правильно (элегантно), если вы Есть несколько советов, пожалуйста, не стесняйтесь делать ваши предложения.
Я делаю домашнюю инкапсуляцию, используя следующий суперкласс:
class MultiLevel_encapsulation {
var separator = "";
var datas:[String:String] = [:]
func wrap() -> String{
var out:String = ""
var i = 0
for (key, data) in datas{
if i==0{
out += key + separator + data
}
else{
out += separator + key + separator + data
}
i+=1
}
return out
}
func unwrap(content:String){
let split = content.components(separatedBy: separator)
var i = 1
while(i < split.count){
datas[split[i-1]] = split[i]
i += 2
}
}
func getAttributesNames() -> [String]{
var out:[String] = []
for (key, _) in datas{
out.append(key)
}
return out
}
func getValue(name:String) -> String? {
return datas[name];
}
func setValue(name:String, value:String){
datas[name] = value;
}
}
и я хочу создать некоторые подклассы, включая суперкласс, я просто изменяю разделитель в зависимости от имени подкласса:
class Level5_encapsulation: MultiLevel_encapsulation{
init(message:String) {
super.init()
separator = "&&LEVEL5&&"
unwrap(content:message)
}
override init() {
super.init()
separator = "&&LEVEL5&&"
}
}
Поэтому после этого мне просто нужно создать подкласс как переменную в моей программе, добавить значения и обернуть его, чтобы получить инкапсулированную строку:
var l5message = Level5_encapsulation()
l5message.setValue(name: #anyTitle#, value: #anyValue#)
var output = l5message.wrap() // String with encapsulated message
Как вы думаете, это правильный способ сделать это или есть лучший способ для этого?
Мой главный вопрос об этом предупреждении компилятора:
Variable 'l5message' was never mutated; consider changing to 'let' constant
Я поменял его на лету, и он работает.
Итак, есть кое-что, чего я не понимаю: почему я могу изменить свойства в суперклассе, как будто унаследованный подкласс объявлен как константа? Где находится хранилище суперкласса и как оно работает?
1 ответ
В Swift классы и структуры ведут себя немного иначе, чем в C++. var и let предотвращают изменение фактического значения, и поскольку тип переменной, которую вы используете, является классом, переменная содержит ссылку, а не фактические данные (например, Level5_encapsulation *l5message).
Поскольку вы не изменяете значение переменной (ссылка), компилятор выдает предупреждение.