不能在类型'String'的不可变值上使用变异成员
问题描述:
我需要在String
扩展名内打印String
。我知道增加一个String
与另一个String
。但是,不能在类型'String'的不可变值上使用变异成员
为什么下面的代码给我一个错误?
这样可以解决这个错误吗?
如果是,如何?
代码:
extension String{
func fruit(){
//After some manipulation with self I need to print
print("Apple".parent("Tree"))
print("Tomato".parent("Plant"))
}
mutating func parent(_ word:String){
self = self+" "+word
}
}
错误:
无法在类型的不可变的值使用可变成员 '字符串'
答
你需要了解的区别一个返回值的非变异函数和一个void mu关闭功能。你写的一个,是一个不同诱变作用:
mutating func parent(_ word:String){
self = self+" "+word
}
这样的变异函数可以使用这样的:
var string = "Hello"
string.parent("World")
print(string)
正如你所看到的,调用parent
改变了存储在值变量string
。
返回的函数是另一回事。这是相同的parent
功能,改写返回一个值:
func parent(_ word: String) -> String {
return self + " " + word
}
您可以使用此函数返回这样的:
print("Apple".parent("Tree"))
print("Tomato".parent("Plant"))
在这种情况下,什么都没有改变。值正在“计算”并返回给调用者。
你在做什么错了基本上是试图使用一个函数,如返回函数。
要解决这个问题,或者改变函数返回一个值,或者正确地使用变异函数,正如我向您展示的那样。
答
parent
是一种变异方法,由于fruit
称之为fruit
也是变异的,所以必须声明为这样。
+1
如果我使'mutating func fruit()'也出现错误'不能在'String''类型的不可变值上使用变异成员。你能否用例子来详细说明? –
返回比分配给自己更好。 +1。 – Alexander
第一个解决方案:当我需要打印1000个单独的水果时,我认为'var string =“Hello”'很差。它也给我一个错误:'不能分配类型'()'的值来键入'String?',而第二个是好的。感谢您的简要解释 –
@ RAJAMOHAN-S如果您认为我的答案回答您的问题,请考虑接受它! – Sweeper