Мутирующая ошибка оператора после перехода на Swift 3, проблема исследована, но не может быть решена

Я получаю сообщение об ошибке "левая часть оператора мутации не является изменяемой"..‹" возвращает неизменяемое значение"

Я прочитал другой пост об изменении значений, но не могу понять, как применяются эти решения.

Код (и комментарии):

 //populate array of 3 random numbers using correct answer and 2 incorrect choices

 func insertIntoArray3(_ randomNumber: Int) -> Int {
for intJ in 0 ..< 2 += 1{

    if arrayIndex != 3 {
        checkIfExists(randomNumber)
        if ifExists {
            let randomNumber = 1 + random() % 10
            insertIntoArray3(randomNumber)
        } else {
            array3[arrayIndex] = (randomNumber)
            arrayIndex = arrayIndex + 1
        }
    }

}
return randomNumber
}

Пересмотренный код:

 //populate array of 3 random numbers using correct answer and 2 incorrect choices
func insertIntoArray3(_ randomNumber: Int) -> Int {

    for _ in 0 ..< 2 + 1{

        if arrayIndex != 3 {
            checkIfExists(randomNumber)
            if ifExists {
                let randomNumber = 1 + arc4random() % 10
                insertIntoArray3(Int(randomNumber))
            } else {
                array3[arrayIndex] = (randomNumber)
                arrayIndex = arrayIndex + 1
            }
        }

    }
    return randomNumber
}

Благодарю вас!

У меня тоже такая же ошибка....

//this function populates an array of the 40 image names

func populateAllImagesArray() {
for  intIA in 1 ..< 11 += 1 {

    tempImageName = ("\(intIA)")
    imageArray.append(tempImageName)

    tempImageName = ("\(intIA)a")
    imageArray.append(tempImageName)

    tempImageName = ("\(intIA)b")
    imageArray.append(tempImageName)

    tempImageName = ("\(intIA)c")
    imageArray.append(tempImageName)
}

//println("imageArray: \(imageArray) ")
//println(imageArray.count)
}

Пересмотрено:

 //this function populates an array of the 40 image names
func populateAllImagesArray() {

    for  intIA in 1 ..< 11 + 1 {

        tempImageName = ("\(intIA)")
        imageArray.append(tempImageName)

        tempImageName = ("\(intIA)a")
        imageArray.append(tempImageName)

        tempImageName = ("\(intIA)b")
        imageArray.append(tempImageName)

        tempImageName = ("\(intIA)c")
        imageArray.append(tempImageName)
    }

    //println("imageArray: \(imageArray) ")
    //println(imageArray.count)
}

Благодарю вас!


person Jimmy Maguire    schedule 02.11.2016    source источник
comment
for intIA in 1 ..< 11 += 1 здесь +=1 неверно.   -  person Ankit Thakur    schedule 02.11.2016


Ответы (3)


Строка, которая выдает ошибку:

for intJ in 0 ..< 2 += 1{

Оператор += — это мутирующий оператор, означающий, что он указывает Swift взять все, что находится слева от него, и изменить его, в данном случае добавляя то, что находится слева. Правильно.

Итак, вы говорите Свифту: возьмите 0 ..< 2 и измените его на (0 ..< 2) + 1. Это вызывает ошибку, поскольку оператор ..< возвращает диапазон, который является неизменяемым — после создания его нельзя изменить.

Даже если бы вы могли изменить диапазон, это, вероятно, не то, что вы хотите делать. Из контекста кажется, что, возможно, вы хотите добавить 1 справа, и в этом случае вы просто избавитесь от =:

for intJ in 0 ..< 2 + 1{

Это просто превращает правую сторону в 3, поэтому цикл идет [0, 1, 2].

Или, может быть, вы просто пытаетесь заставить его увеличиваться на 1 каждый раз, как i += 1 в стандартном цикле for в стиле C. Если это так, то он здесь не нужен. Индексация на 1 — это поведение по умолчанию, поэтому вы можете опустить весь бит += 1:

for intJ in 0 ..< 2 {

Или, если вам нужно увеличить значение, отличное от 1, вы можете использовать протокол Strideable. , который выглядит так:

for intJ in stride(from: min, to: max, by: increment) {

Просто замените min, max и increment на соответствующие цифры.

person Robert    schedule 02.11.2016
comment
Благодарю вас! измененный код: func insertIntoArray3(_ randomNumber: Int) -> Int { for _ in 0 ..‹ 2 + 1{ if arrayIndex != 3 { checkIfExists(randomNumber) if ifExists { let randomNumber = 1 + arc4random() % 10 insertIntoArray3 (Int(randomNumber)) } else { array3[arrayIndex] = (randomNumber) arrayIndex = arrayIndex + 1 } } } return randomNumber } - person Jimmy Maguire; 03.11.2016

добавить var в цикл for, сделает левую переменную изменяемой

for var intIA in 1 ..< 11 {

    intIA = intIA+3
    print("\(intIA)")
}

А в вашем фрагменте for intIA in 1 ..< 11 += 1 здесь +=1 неверно.

person Ankit Thakur    schedule 02.11.2016
comment
Попробую и это - person Jimmy Maguire; 03.11.2016

Вот реальный пример использования обычной функции setUpTable.

Swift 2: петля C-стиля

func setupTable() {
    tableView.setNumberOfRows(nameArray.count, withRowType: "ContactListCell")    
    for i in 0 ..< nameArray.count += 1 {
        let cell = tableView.rowController(at: Int(i)) as? ContactListCell
        let nameText = nameArray[i]
        cell!.nameLabel.setText(nameText)
    }
}

Ошибка: левая часть оператора мутации не является изменяемой "..‹" возвращает неизменяемое значение

Исправление Swift 3: когда мы настраиваем таблицы, мы перебираем строки ячеек, т. Е. ContactListCell, чтобы мы могли отображать их в таблице. for i in 0 ..< nameArray.count уже индексируется на 1, поэтому нам не нужен синтаксис += 1 в стиле C.

for i in 0 ..< nameArray.count {}
person Edison    schedule 21.01.2017