不能在类型'String'的不可变值上使用变异成员

不能在类型'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")) 

在这种情况下,什么都没有改变。值正在“计算”并返回给调用者。

你在做什么错了基本上是试图使用一个函数,如返回函数。

要解决这个问题,或者改变函数返回一个值,或者正确地使用变异函数,正如我向您展示的那样。

+0

返回比分配给自己更好。 +1。 – Alexander

+0

第一个解决方案:当我需要打印1000个单独的水果时,我认为'var string =“Hello”'很差。它也给我一个错误:'不能分配类型'()'的值来键入'String?',而第二个是好的。感谢您的简要解释 –

+2

@ RAJAMOHAN-S如果您认为我的答案回答您的问题,请考虑接受它! – Sweeper

parent是一种变异方法,由于fruit称之为fruit也是变异的,所以必须声明为这样。

+1

如果我使'mutating func fruit()'也出现错误'不能在'String''类型的不可变值上使用变异成员。你能否用例子来详细说明? –