我需要在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
}
}
错误:
不能对'String'类型的不可变值使用变异成员
答案 0 :(得分:11)
您需要了解返回值的非变异函数与void变异函数之间的区别。你写的那个是变异函数:
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"))
在这种情况下,没有任何改变。价值正在被计算"并返回给来电者。
你做错了什么基本上尝试使用像返回的函数一样的变异函数。
要解决此问题,请更改函数以返回值,或正确使用变异函数,如我所示。
答案 1 :(得分:1)
parent
是一种变异方法,自fruit
调用它以来,fruit
也在变异,并且必须声明为此类。