Переменная '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).

Поскольку вы не изменяете значение переменной (ссылка), компилятор выдает предупреждение.

Другие вопросы по тегам