Хорошо, я просто обновил Xcode до 7.3 и теперь получаю это предупреждение:
Параметры 'var' устарели и будут удалены в Swift 3.
Как исправить это, когда мне нужно использовать var в этой функции:
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
иметь никаких побочных эффектов.func foo(_ bar: int) { /*use bar*/ bar+=1; foo(bar); }
. Это невозможно без параметров var. Вам нужно либо создать отдельную переменную внутри функции и скопировать значение, либо пометить параметр как inout. Первый медленный, второй вызывает неопределенное поведение. Многие алгоритмы используют такую рекурсию.Ответы:
Вы пытались назначить новую переменную
источник
Обсуждение удаления Var из параметра функции полностью задокументировано в этой публикации на GitHub: Remove Var Parameters
В этом документе вы обнаружите, что люди часто путают
var
параметры сinout
параметрами.var
Параметр просто означает , что параметр является изменяемым в контексте функции, в то время как сinout
параметром значение параметра в точке возврата будет скопировано из функции , и в контекст вызывающего абонента.Правильный способ решить эту проблему - удалить
var
из параметра и ввести локальнуюvar
переменную. В верхней части подпрограммы скопируйте значение параметра в эту переменную.источник
Просто добавьте эту строку в начало функции:
а остальная часть вашего кода может остаться без изменений, например:
источник
Многие люди предлагают
inout
параметр, но на самом деле они созданы не для этого. Кроме того, он не позволяет вызывать функцию сlet
константой или строковым литералом. Почему бы вам просто не добавить значение по умолчанию в подпись функции?Просто убедитесь, что вы не вызываете
getQuestionList
пустую строку, если вам нужен язык по умолчанию, а просто оставьте параметр:источник
Swift 4
В некоторых случаях, как я испытал (с более сложными настройками, включающими массивы), создание нового свойства внутри метода и изменение этого свойства может не всегда работать. Не говоря уже о том, что вы загромождаете метод вместо того, чтобы просто добавлять его
inout
к параметру и&
его аргументу, для чего был создан этот синтаксис.источник
}
источник
Я думаю, что ответы @Harris и @garanda - лучший подход.
В любом случае, в вашем случае нет необходимости в var, вы можете:
источник
https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/Functions.html
Параметры входа-выхода
Параметры функции по умолчанию являются константами. Попытка изменить значение параметра функции из тела этой функции приводит к ошибке времени компиляции. Это означает, что вы не можете изменить значение параметра по ошибке. Если вы хотите, чтобы функция изменяла значение параметра, и вы хотите, чтобы эти изменения сохранялись после завершения вызова функции, вместо этого определите этот параметр как параметр входа-выхода.
Вы пишете параметр in-out, помещая ключевое слово inout прямо перед типом параметра. Параметр входа-выхода имеет значение, которое передается в функцию, модифицируется функцией и передается обратно из функции для замены исходного значения. Подробное обсуждение поведения параметров ввода-вывода и связанных оптимизаций компилятора см. В разделе Параметры ввода-вывода.
Вы можете передавать только переменную в качестве аргумента для входящего-выходного параметра. Вы не можете передать константу или буквальное значение в качестве аргумента, потому что константы и литералы не могут быть изменены. Вы помещаете амперсанд (&) непосредственно перед именем переменной, когда вы передаете его в качестве аргумента входному-выходному параметру, чтобы указать, что оно может быть изменено функцией.
НОТА
Параметры ввода-вывода не могут иметь значений по умолчанию, а параметры с переменными параметрами не могут быть помечены как входящие.
Вот пример функции под названием swapTwoInts ( : :), которая имеет два целочисленных параметра входа -выхода, называемых a и b:
Функция swapTwoInts ( : :) просто меняет местами значение b на a, а значение a на b. Функция выполняет этот обмен, сохраняя значение a во временной константе с именем временнаяA, присваивая значение b переменной a, а затем присваивая временную переменную b.
Вы можете вызвать функцию swapTwoInts ( : :) с двумя переменными типа Int, чтобы поменять местами их значения. Обратите внимание, что имена someInt и anotherInt имеют префикс амперсанда, когда они передаются в функцию swapTwoInts ( : :):
В приведенном выше примере показано, что исходные значения someInt и anotherInt изменяются функцией swapTwoInts ( : :), даже если они изначально были определены вне функции.
НОТА
Параметры ввода-вывода - это не то же самое, что возвращаемое значение из функции. В приведенном выше примере swapTwoInts не определяется тип возвращаемого значения и не возвращается значение, но он по-прежнему изменяет значения someInt и anotherInt. Параметры ввода-вывода - это альтернативный способ для функции иметь эффект, выходящий за рамки ее тела функции.
источник
Вот еще одна идея. Мой вариант использования заключался в передаче массива строк для добавления к нему, для чего массив должен передаваться изменчиво. Я тоже не хотел, чтобы в моем классе было такое положение. Итак, я создал класс, содержащий массив, и передал его. В зависимости от вашего варианта использования может показаться глупым иметь класс, содержащий только эту одну переменную.
Я использую только методы
append
иjoined
в массиве, поэтому было легко изменить тип с минимальными другими изменениями в моем коде.Пример использования:
источник