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 № 1Musisz 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.