变量' xxx'从未发生变异;在派生类中

时间:2017-07-27 14:27:58

标签: swift class inheritance mutating-function

我在这里发布了我的第一条消息,我提出了一个关于快速语言的逻辑问题。为了您的信息,我在快速语言方面相当新鲜,我习惯使用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,添加值并将其包装为具有封装的字符串:

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 个答案:

答案 0 :(得分:0)

在Swift中,结构的行为与在C ++中的行为略有不同。 var 阻止更改实际值,并且由于您使用的变量类型是,变量包含参考,而非实际数据(如Level5_encapsulation * l5message)。

由于您没有改变变量的值(A引用),编译器会发出警告。