Jak mogę sobie poradzić z tym błędem bez tworzenia dodatkowej zmiennej?
func reduceToZero(x:Int) -> Int {
while (x != 0) {
x = x-1 // ERROR: cannot assign to 'let' value 'x'
}
return x
}
Nie chcę tworzyć dodatkowej zmiennej tylko po to, aby przechowywać wartość x. Czy w ogóle można robić to, co chcę?
swift
syntax
immutability
mutability
Gabriel
źródło
źródło
Odpowiedzi:
Jak stwierdzono w innych odpowiedziach, od wersji Swift 3 umieszczanie zmiennej przed zmienną została wycofana. Chociaż nie podano w innych odpowiedziach, jest możliwość zadeklarowania
inout
parametru. Pomyśl: podając wskaźnik.Może to być szczególnie przydatne w przypadku rekurencji.
inout
Wytyczne dotyczące deklaracji Apple można znaleźć tutaj .źródło
inout
słowo kluczowe powinno być umieszczone pomiędzy nazwą parametru a typem parametru w następujący sposób:func reduceToZero(x: inout Int)
w obecnej wersji Swift 3.Parametry „var” są przestarzałe i zostaną usunięte w języku Swift 3. Dlatego przypisanie do nowego parametru wydaje się teraz najlepszym sposobem:
jak wspomniano tutaj: parametry „var” są przestarzałe i zostaną usunięte w języku Swift 3
źródło
x
w nowymvar x
? A może Swift robi coś bardziej wydajnego niż to?x
wpisuje się w rejestrze) nie ma praktycznie żadnych kosztów. Jeślix
jest to tablica, struktura lub obiekt, który jest zmutowany, to prawie na pewno trzeba wykonać kopię (chyba że optymalizator może przeanalizować ją wewnętrznie i utworzyć alias).var
argumentów niż użycie,inout
które może mieć niezamierzone skutki uboczne, zwł. gdyby var był wskaźnikiem.Dla Swift 1 i 2 (dla Swift 3 patrz odpowiedź achi przy użyciu parametru inout): Argument funkcji w Swift jest
let
domyślny, więc zmień go na,var
jeśli chcesz zmienić wartość, tj.źródło
var
w parametrach jest bardzo prawdopodobne, że znikną w nowszych wersjach Swift na github.com/apple/swift-evolution/blob/master/propeals/ ...Odpowiedź Swift3 za przekazanie wskaźnika tablicy mutable.
Funkcjonować:
Wezwanie do funkcji:
źródło
W Swift po prostu dodajesz
var
słowo kluczowe przed nazwą zmiennej w deklaracji funkcji:Zapoznaj się z podrozdziałem „Parametry stałe i zmienne” w rozdziale „Funkcje” książki Swift (strona 210 w iBooku w obecnym stanie).
źródło
Są przypadki, w których nie chcieliśmy używać
inout
Możemy użyć czegoś takiego, jeśli chcesz, aby te zmiany / zakres były tylko wewnątrz funkcji:
źródło
Rozwiązanie wykorzystujące Swift5 z programowaniem funkcjonalnym ...
źródło