Я решаю проблему, и мне нужно уменьшить значение k, которое является параметром функции, но когда я уменьшаю значение k, он говорит: Cannot assign to value: 'k' is a 'let' constant
Вот код
var count:Int = 0
func maximumToys(prices: [Int], k: Int) {
for i in prices {
if i < k {
k = k - i
}
} }
Создайте локальную переменную в своей функции и верните результат из своей функции, вместо того, чтобы пытаться манипулировать внешней переменной, переданной извне.
Проблема в том, что ваш код не имеет смысла. Почему вы меняете k? Для чего рассчитан? Что ты на самом деле пытаешься сделать? Вы пытаетесь найти макс / мин в массиве? Это не то, как это делать. Будьте информативнее! Спасибо
это жадная проблема, поэтому для каждого i <price мне нужно уменьшить значение k.
Но вам нужно ЗАЯВИТЬ проблему.





Вы можете использовать ключевое слово inout. Попробуй это:
func maximumToys(prices: [Int], k: inout Int) {
for i in prices {
if i < k {
k = k - i
}
}
}
Пример использования:
var prices = [Int]()
prices.append(1)
prices.append(2)
var k = 4;
maximumToys(prices: prices, k: &k)
Зачем использовать inout вместо простого возвращаемого значения?
Это решение. Возвращаемое значение - другое решение. Если возможно, он не хочет использовать возвращаемое значение.
Решение с использованием inout работает, но я не советую. Это затрудняет отслеживание потока информации. Лучше скопировать k в локальную переменную и переписать вашу функцию, чтобы вернуть измененную локальную переменную.
Я не согласен с вами. Ключевое слово inout полезно в некоторых случаях. Это похоже на указатели, особенно когда вы не хотите создавать новую переменную и копировать ее в возвращаемое значение.
Также яблоко говорит: в качестве оптимизации, когда аргумент представляет собой значение, хранящееся по физическому адресу в памяти, одно и то же место в памяти используется как внутри, так и вне тела функции. Оптимизированное поведение известно как вызов по ссылке; он удовлетворяет всем требованиям модели «копирование - вход - копирование», устраняя при этом накладные расходы на копирование. Не полагайтесь на различия в поведении между копированием в копировании и вызовом по ссылке.
В Swift переменные в функциях по умолчанию являются константами и копии исходного значения (при условии, что они являются структурами, как в случае с Ints).
Есть два способа обойти это:
Вы можете либо объявить копию переменной в теле функции, а затем вернуть k:
func maximumToys(prices: [Int], k: Int) -> Int {
var k = k
...
return k
}
Или вы можете использовать ключевое слово inout для переменной. Если вы используете ключевое слово inout, имейте в виду, что вы собираетесь изменить исходное значение. Это делает ваш код более небезопасным для потоков, поскольку несколько обращений к одному и тому же пути в памяти могут привести к неопределенному поведению.
Да, вы не можете обновить значение «k»
Просто используйте временную переменную
var count:Int = 0
func maximumToys(prices: [Int], k: Int) -> Int {
var j = k //temp variable
for i in prices {
if i < j {
J = j - i
}
}
return j
}
let result = maximumToys(prices: [10,20], k: 30)
если переменная поступает из параметра, просто используйте ключевое слово inout перед именем переменной, как это
func convertToBytes(bytesToSave : inout [UInt64])
да, K неизменяемый, так как я могу сделать его изменяемым?