parametry 'var' są przestarzałe i zostaną usunięte w Swift 3
W porządku więc po prostu zaktualizowałem Xcode do 7.3 i teraz dostaję to Ostrzeżenie:
Parametry ' var ' są przestarzałe i zostaną usunięte w 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()
}
8 answers
Czy próbowałeś przypisać do nowego var
public func getQuestionList(language: String) -> NSArray {
var lang = language
if self.data.count > 0 {
if (lang.isEmpty) {
lang = "NL"
}
return self.data.objectForKey("questionList" + lang) as! NSArray
}
return NSArray()
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-03-22 23:12:38
Dyskusja o usunięciu Var z parametru funkcji jest w pełni udokumentowana w tym zgłoszeniu na GitHub: Usuń parametry Var
W tym dokumencie można zauważyć, że ludzie często mylą parametry var
z parametrami inout
. Parametr var
oznacza po prostu, że parametr jest zmienny w kontekście funkcji, podczas gdy z parametrem inout
wartość parametru w punkcie powrotu zostanie skopiowana z funkcji i do wywołującego kontekst.
Poprawnym sposobem rozwiązania tego problemu jest usunięcie var
z parametru i wprowadzenie lokalnej zmiennej var
. W górnej części procedury skopiuj wartość parametru do tej zmiennej.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-03-22 21:40:57
Wystarczy dodać tę jedną linię na początku funkcji:
var language = language
A reszta kodu może pozostać niezmieniona, TAK:
public func getQuestionList(language: String) -> NSArray {
var language = language
if self.data.count > 0 {
if (language.isEmpty) {
language = "NL"
}
return self.data.objectForKey("questionList" + language) as! NSArray
}
return NSArray()
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-04-27 03:26:12
Wiele osób sugeruje parametr inout
, ale tak naprawdę nie do tego są przeznaczone. Poza tym, nie pozwala na wywołanie funkcji ze stałą let
, ani z literalnym łańcuchem znaków. Dlaczego po prostu nie dodasz wartości domyślnej do podpisu funkcji?
public func getQuestionList(language language: String = "NL") -> NSArray {
if data.count > 0 {
return data.objectForKey("questionList" + language) as! NSArray
} else {
return NSArray()
}
}
Upewnij się, że nie wywołasz getQuestionList
z pustym łańcuchem znaków w przypadku, gdy chcesz mieć domyślny język, ale pomiń parametr:
let list = getQuestionList() // uses the default "NL" language
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-03-22 21:17:48
public func getQuestionList(language: inout String) -> NSArray {
if self.data.count > 0 {
if (language.isEmpty) {
language = "NL"
}
return self.data.objectForKey("questionList" + language) as! NSArray
}
return NSArray()
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-01-04 17:51:38
Myślę, że odpowiedzi @ Harris i @ garanda są najlepszym podejściem.
W każdym razie w Twoim przypadku, nie ma potrzeby var, możesz zrobić:
public func getQuestionList(language: String) -> NSArray {
if self.data.count > 0 {
return self.data.objectForKey("questionList" + (language.isEmpty ? "NL" : language)) as! NSArray
}
return NSArray()
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-06-14 16:35:37
Parametry Wejścia-Wyjścia
Parametry funkcji są domyślnie stałymi. Próba zmiany wartości parametru funkcji z wnętrza ciała tej funkcji powoduje błąd w czasie kompilacji. Oznacza to, że przez pomyłkę nie można zmienić wartości parametru. Jeśli chcesz, aby funkcja zmodyfikowała wartość parametru i chcesz, aby te zmiany persist po zakończeniu wywołania funkcji zdefiniuj ten parametr jako parametr wejścia-wyjścia.
Zapisujesz 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 jest przekazywana z powrotem z funkcji, aby zastąpić oryginalną wartość. Szczegółowe omówienie zachowania parametrów in-out i związanych z nimi optymalizacji kompilatora można znaleźć w artykule In-Out Parametry.
Możesz przekazać zmienną tylko jako argument parametru in-out. Nie można przekazać stałej lub wartości literalnej jako argumentu, ponieważ stałe i literały nie mogą być modyfikowane. Umieszczasz ampersand ( & ) bezpośrednio przed nazwą zmiennej, gdy przekazujesz ją jako argument do parametru in-out, aby wskazać, że może być modyfikowana przez funkcję.
Uwaga
Parametry wejścia-wyjścia nie mogą mieć wartości domyślnych, a zmienne parametry nie mogą być oznaczone jako inout.
Oto przykład funkcji o nazwie swapTwoInts(::), który ma dwa parametry in-out o nazwie a i b:
func swapTwoInts(_ a: inout Int, _ b: inout Int) {
let temporaryA = a
a = b
b = temporaryA
}
SwapTwoInts(::) funkcja 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 temporaryA, przypisując wartość b do a, a następnie przypisując temporaryA do b.
Możesz nazwać swapTwoInts(::) funkcja z dwiema zmiennymi typu Int do zamiany ich wartości. Zauważ, że nazwy someInt i anotherInt są poprzedzone znakiem ampersand, gdy są przekazywane do punktów swapTwoInts(::) Funkcja:
var someInt = 3
var anotherInt = 107
swapTwoInts(&someInt, &anotherInt)
print("someInt is now \(someInt), and anotherInt is now \(anotherInt)")
// Prints "someInt is now 107, and anotherInt is now 3"
Powyższy przykład pokazuje, że oryginalne wartości someInt i anotherInt są modyfikowane przez punkty swaptwoint(::) funkcji, mimo że pierwotnie były zdefiniowane poza funkcją.
Uwaga
Parametry wejścia-wyjścia nie są takie same jak zwracanie wartości z funkcji. Powyższy przykład swaptwoint nie definiuje typu zwracanego ani zwracanej wartości, ale nadal modyfikuje wartości someInt i anotherInt. Parametry In-out są alternatywnym sposobem działania funkcji poza zakresem jej ciała funkcyjnego.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-01-31 16:03:50
Oto inny pomysł. Moim przypadkiem użycia było przekazanie tablicy łańcuchowej, aby do niej dołączyć, dla której tablica musi być przekazywana mutably. Ja też nie chciałem mieć stanu w klasie za to. Więc zrobiłem klasę, która trzyma tablicę i zdać to. W zależności od przypadku użycia może wydawać się głupie mieć klasę, która posiada tylko tę jedną zmienną.
private class StringBuilder {
var buffer: [String] = []
func append(_ str: String) {
buffer.append(str)
}
func toString() -> String {
return buffer.joined()
}
}
Używam tylko metod append
i joined
na tablicy, więc łatwo było zmienić typ z minimalnymi innymi zmianami w moim kod.
Niektóre przykładowe użycie:
private func writeMap(map: LevelMap, url: URL) -> Bool {
let buffer = StringBuilder()
if !writeHeader(map: map, buffer: buffer) {
return false
}
if !writeFloors(map: map, buffer: buffer) {
return false
}
let content = buffer.toString()
do {
try content.write(to: url, atomically: true, encoding: .utf8)
return true
} catch {}
return false
}
private func writeHeader(map: LevelMap, buffer: StringBuilder) -> Bool {
buffer.append("something here ...\n")
return true
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-02-12 01:52:21