变量 'xxx' 从未发生过变化;在派生中 class
Variable 'xxx' was never mutated; in derived class
我在这里发布我的第一条消息,我有一个关于 swift 语言的逻辑问题。供您参考,我是 swift 语言的新手,我习惯用 C++ 编写代码,我很难对如何正确做事有一个 objective 的观点(以一种优雅的方式),如果您有任何建议,请随时提出您的建议。
我正在使用以下超类进行自制封装:
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
我换了一个 let,它起作用了。
所以有些事情我不明白:为什么我可以更改超类中的属性,就好像继承的子类被声明为常量一样?超类的存储在哪里,它是如何工作的?
在 Swift classes 和 structs 中的行为与在 C++ 中略有不同。 var 和 let 防止更改实际值,并且由于您使用的变量类型是 class 变量包含 reference,而不是实际数据(如 Level5_encapsulation *l5message)。
由于您没有改变变量(引用)的值,编译器会发出警告。
我在这里发布我的第一条消息,我有一个关于 swift 语言的逻辑问题。供您参考,我是 swift 语言的新手,我习惯用 C++ 编写代码,我很难对如何正确做事有一个 objective 的观点(以一种优雅的方式),如果您有任何建议,请随时提出您的建议。
我正在使用以下超类进行自制封装:
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
我换了一个 let,它起作用了。
所以有些事情我不明白:为什么我可以更改超类中的属性,就好像继承的子类被声明为常量一样?超类的存储在哪里,它是如何工作的?
在 Swift classes 和 structs 中的行为与在 C++ 中略有不同。 var 和 let 防止更改实际值,并且由于您使用的变量类型是 class 变量包含 reference,而不是实际数据(如 Level5_encapsulation *l5message)。
由于您没有改变变量(引用)的值,编译器会发出警告。