/ / Nie można użyć mutującego elementu na niezmiennej wartości typu "String" - swift, swift3

Nie można użyć elementu mutingu na niezmiennej wartości typu "String" - swift, swift3

Muszę wydrukować String w środku String rozszerzenia. Zdaję sobie sprawę z dodania jednego String z innym String. Ale,

Dlaczego poniżej kodu daje mi błąd?

Czy w ten sposób można rozwiązać ten błąd?

Jeśli tak, w jaki sposób?

Kod:

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

}
}

Błąd:

Nie można użyć elementu mutingu na niezmiennej wartości typu "String"

Odpowiedzi:

10 dla odpowiedzi № 1

Musisz zrozumieć różnicę między nie mutującą funkcją, która zwraca wartość, a funkcją unieważniającą mutację. Ta, którą napisałeś, jest funkcją mutującą:

mutating func parent(_ word:String){

self = self+" "+word

}

Mutujące funkcje, takie jak ta, mogą być używane w następujący sposób:

var string = "Hello"
string.parent("World")
print(string)

Jak widać, połączenie z parent zmienia wartość, która jest przechowywana w zmiennej string.


Funkcja, która zwraca, to inna sprawa. to jest to samo parent funkcja, przepisana w celu zwrócenia wartości:

func parent(_ word: String) -> String {
return self + " " + word
}

Możesz użyć tej funkcji, która zwraca się w następujący sposób:

print("Apple".parent("Tree"))
print("Tomato".parent("Plant"))

W tym przypadku nic się nie zmienia. Wartości są po prostu "obliczane" i zwracane rozmówcy.

Co robisz źle jest w zasadzie próbując użyć funkcji mutującej, takiej jak funkcja, która zwraca.

Aby to naprawić, zmień funkcję, aby zwrócić wartość, lub użyj poprawnie funkcji mutacji, tak jak ci to pokazałem.


1 dla odpowiedzi nr 2

parent jest metodą mutacji i od tego czasu fruit nazywa to, fruit również mutuje i musi zostać zadeklarowany jako taki.