W porządku, więc po prostu zaktualizowałem Xcode do 7.3 i teraz otrzymuję to ostrzeżenie:
Parametry „var” są przestarzałe i zostaną usunięte w języku Swift 3
Jak to naprawić, gdy muszę użyć var w tej funkcji:
public func getQuestionList(var language: String) -> NSArray {
if self.data.count > 0 {
if (language.isEmpty) {
language = "NL"
}
return self.data.objectForKey("questionList" + language) as! NSArray
}
return NSArray()
}
public func getQuestionList(inout language: String) -> NSArray
getQuestion
mieć żadnych skutków ubocznych.func foo(_ bar: int) { /*use bar*/ bar+=1; foo(bar); }
. Jest to niemożliwe bez var params. Musisz albo utworzyć oddzielną zmienną w funkcji i skopiować wartość, albo oznaczyć parametr jako inout. Pierwsza jest powolna, druga powoduje niezdefiniowane zachowanie. Wiele algorytmów używa takiej rekurencji.Odpowiedzi:
Czy próbowałeś przypisać do nowego var
źródło
Omówienie usunięcia Var z parametru funkcji jest w pełni udokumentowane w tym przesłaniu na GitHub: Remove Var Parameters
W tym dokumencie zobaczysz, że ludzie często mylą
var
parametry zinout
parametrami.var
Parametrów oznacza, że parametr jest zmienne w odniesieniu do funkcji, a ze związkieminout
parametrem wartość parametru w punkcie zwrotu zostaną skopiowane z funkcji i w kontekście rozmówcy.Prawidłowym sposobem rozwiązania tego problemu jest usunięcie
var
z parametru i wprowadzenievar
zmiennej lokalnej . W górnej części procedury skopiuj wartość parametru do tej zmiennej.źródło
Po prostu dodaj tę jedną linię na początku funkcji:
a reszta kodu może pozostać niezmieniona, na przykład:
źródło
Wiele osób sugeruje
inout
parametr, ale tak naprawdę nie do tego zostały zaprojektowane. Poza tym nie pozwala na wywołanie funkcjilet
stałą, ani literałem tekstowym. Dlaczego po prostu nie dodasz wartości domyślnej do sygnatury funkcji?Tylko pamiętaj, aby nie wywoływać
getQuestionList
z pustym ciągiem znaków na wypadek, gdybyś chciał użyć języka domyślnego, ale po prostu pomiń parametr:źródło
Szybki 4
W niektórych przypadkach, jak doświadczyłem (przy bardziej złożonych konfiguracjach obejmujących tablice), tworzenie nowej właściwości w metodzie i jej mutowanie może nie zawsze działać. Nie wspominając o tym, że zaśmiecasz metodę zamiast po prostu dołączać ją
inout
do parametru i&
jego argumentu, do czego została stworzona ta składnia.źródło
}
źródło
Myślę, że odpowiedzi @Harris i @garanda to najlepsze podejście.
W każdym razie w twoim przypadku nie potrzebujesz var, możesz zrobić:
źródło
https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/Functions.html
Parametry wejściowe i wyjściowe
Parametry funkcji są domyślnie stałymi. Próba zmiany wartości parametru funkcji w treści tej funkcji powoduje błąd w czasie kompilacji. Oznacza to, że nie można przez pomyłkę zmienić wartości parametru. Jeśli chcesz, aby funkcja modyfikowała wartość parametru i chcesz, aby te zmiany były trwałe po zakończeniu wywołania funkcji, zamiast tego zdefiniuj ten parametr jako parametr wejściowy.
Piszesz parametr in-out, umieszczając słowo kluczowe inout tuż przed typem parametru. Parametr in-out ma wartość, która jest przekazywana do funkcji, jest modyfikowana przez funkcję i przekazywana z powrotem z funkcji w celu zastąpienia oryginalnej wartości. Aby uzyskać szczegółowe omówienie zachowania parametrów wejściowych i wyjściowych i skojarzonych z nimi optymalizacji kompilatora, zobacz Parametry we-wy.
Możesz przekazać zmienną tylko jako argument dla parametru wejściowego-wyjściowego. Nie można przekazać stałej ani wartości literalnej jako argumentu, ponieważ stałych i literałów nie można modyfikować. Umieszczasz znak ampersand (&) bezpośrednio przed nazwą zmiennej, gdy przekazujesz ją jako argument do parametru wejściowego, aby wskazać, że może być modyfikowana przez funkcję.
UWAGA
Parametry wejściowe nie mogą mieć wartości domyślnych, a parametry zmienne nie mogą być oznaczone jako inout.
Oto przykład funkcji o nazwie swapTwoInts ( : :), która ma dwa wejściowe i wyjściowe parametry całkowite zwane a i b:
Funkcja swapTwoInts ( : :) po prostu zamienia wartość b na a, a wartość a na b. Funkcja wykonuje tę zamianę, przechowując wartość a w tymczasowej stałej o nazwie tymczasowa A, przypisując wartość b do a, a następnie przypisując tymczasową A do b.
Możesz wywołać funkcję swapTwoInts ( : :) z dwiema zmiennymi typu Int, aby zamienić ich wartości. Zauważ, że nazwy someInt i anotherInt są poprzedzone ampersandem, gdy są przekazywane do funkcji swapTwoInts ( : :):
Powyższy przykład pokazuje, że oryginalne wartości someInt i anotherInt są modyfikowane przez swapTwoInts ( : :), mimo że zostały pierwotnie zdefiniowane poza funkcją.
UWAGA
Parametry wejściowe i wyjściowe nie są tym samym, co zwracanie wartości z funkcji. Powyższy przykład swapTwoInts nie definiuje zwracanego typu ani nie zwraca wartości, ale nadal modyfikuje wartości someInt i anotherInt. Parametry wejściowe i wyjściowe to alternatywny sposób na wywołanie przez funkcję efektu poza zakresem jej treści.
źródło
Oto kolejny pomysł. Moim przypadkiem użycia było przekazanie tablicy ciągów, aby ją dołączyć, dla której tablica musi być przekazywana mutacyjnie. Ja też nie chciałem mieć w swojej klasie stanu. Więc stworzyłem klasę, która przechowuje tablicę i przekazuje ją. W zależności od twojego przypadku użycia może wydawać się głupie posiadanie klasy, która przechowuje tylko tę jedną zmienną.
Używam tylko metod
append
ijoined
na tablicy, więc łatwo było zmienić typ przy minimalnych innych zmianach w moim kodzie.Przykładowe użycie:
źródło