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

时间:2017-08-02 03:49:24

标签: swift swift3

我需要在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'类型的不可变值使用变异成员

2 个答案:

答案 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也在变异,并且必须声明为此类。