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()
}
Author: Nakilon, 2016-03-22

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()
}
 83
Author: garanda,
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.

 102
Author: Tr0yJ,
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()
}
 63
Author: Harris,
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
 13
Author: Tim Vermeulen,
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()

}

 1
Author: Abdul Rahman Khan,
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()
}
 0
Author: Simone Pistecchia,
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

Https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/Functions.html

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.

 0
Author: Mustafa Mohammed,
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
}
 0
Author: webjprgm,
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