gpt4 book ai didi

swift - 变量 'xxx' 从未发生过突变;在派生类中

转载 作者:行者123 更新时间:2023-11-30 12:16:43 25 4
gpt4 key购买 nike

我在这里发布我的第一条消息,我有一个关于 swift 语言的逻辑问题。供您引用,我对 swift 语言很陌生,我习惯用 C++ 编写代码,对我来说,对如何正确地做事(以优雅的方式)有一个客观的观点有点困难,如果你有一些建议,请随时提出您的建议。

我正在使用以下父类(super class)进行自制封装:

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;
}

}

我想创建一些子类,包括父类(super class),我只需根据子类名称更改分隔符:

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

我把它改了一下,它起作用了。

所以有一些我不明白的地方:为什么我可以改变父类(super class)中的属性,就好像继承的子类被声明为常量一样?父类(super class)的存储位置在哪里以及它是如何工作的?

最佳答案

在 Swift 中,结构的行为与 C++ 中的行为略有不同。 varlet 防止更改实际值,并且由于您使用的变量类型是 ,因此该变量包含 >引用,而不是实际数据(如 Level5_encapsulation *l5message)。

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

关于swift - 变量 'xxx' 从未发生过突变;在派生类中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45353725/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com