Быстрая фатальная ошибка: не удается сформировать диапазон с верхней границей ‹ нижней границей

У меня есть класс, который я хочу добавить туда с помощью цикла for.

Это мой класс:

public class Expandable {
    public var name: String
    public var id:Int

    init(name: String, id:Int) {
        self.name = name
        self.id = id
    }

Я могу добавить вручную вот так:

let a = [Expandable(name:"aaa", id: 12)]

Но когда я пытаюсь использовать цикл for, он вообще не работает.

for allin in items{
    sidebarMenuItem?.append(Expandable(name: allin["Code"] as! String, id: allin["Id"] as! Int))
}

Items данные работают отлично, но sidebarMenuItem получает значение Optional(MyProjectName.Expandable), когда я их печатаю.

ОБНОВИТЬ :

Я понял, что хорошо получаю данные, но получаю ошибку в функции expandCell:

фатальная ошибка: не удается сформировать диапазон с верхней границей ‹ нижней границей

Моя функция ExpandCell:

private func expandCell(tableView: UITableView, index: Int) {
    // Expand Cell (add ExpansionCells
    if let expansions = sideBarData?[index]?.expandable {
        for i in 1...expansions.count {
            sideBarData?.insert(nil, at: index + i)
            tableView.insertRows(at: [NSIndexPath(row: index + i, section: 0) as IndexPath] , with: .top)
        }
    }
}

person jorjj    schedule 23.06.2017    source источник
comment
sidebarMenuItem, очевидно, является необязательным (или даже имеет тип [Expandable?]), чего вы ожидаете? Во многих случаях бессмысленно объявлять массивы необязательными.   -  person vadian    schedule 23.06.2017
comment
@vadian Я сделал необязательный, потому что я использую этот класс в расширяемом списке таблиц. если он пуст, я не добавляю новый расширяемый список. Это моя цель.   -  person jorjj    schedule 23.06.2017
comment
Не объявляйте массивы источников данных как необязательные и не используйте необязательные типы в массиве источников данных. Или базовое табличное представление тоже не является обязательным?   -  person vadian    schedule 23.06.2017
comment
нет, tableview не является обязательным. хорошо, я исправлю это. так что вы предлагаете для моей проблемы?   -  person jorjj    schedule 23.06.2017
comment
Попробуйте for i in expansions.indices {   -  person Leo Dabus    schedule 23.06.2017


Ответы (5)


sidebarMenuItem является необязательным, потому что вы объявили его необязательным. Попробуй это.

var sidebarMenuItem = [Expandable]()

for allin in items{
    sidebarMenuItem.append(Expandable(name: allin["Code"] as! String, id: allin["Id"] as! Int))
}
person Bilal    schedule 23.06.2017
comment
это тоже не работает. Теперь я получаю фатальную ошибку: Не удается сформировать диапазон с верхней границей ‹ нижней границей. расширить ячейку не работает, потому что я думаю, что sidebarMenuItem пуст. - person jorjj; 23.06.2017

SWIFT 4

Чтобы сформировать диапазон от верхней границы до нижней границы, используйте stride, как на этой странице документации: от:до:по:)

for i in stride(from: 10, through: 5, by: -1) { print(i) }

и выполните шаг, если вы хотите включить нижнюю границу: :)

person Wissa    schedule 13.06.2019

Я не уверен, какова ваша структура расширений. Но я предполагаю, что для какой-то ячейки может быть, что ваш счетчик расширения равен 0. Вот почему он дает эту ошибку, когда ваш начальный индекс равен 1, а конечный индекс равен 0.

person Krishna Kumar    schedule 23.06.2017

попробуй это:

  private func expandCell(tableView: UITableView, index: Int) {
        // Expand Cell (add ExpansionCells
        if let expansions = sideBarData?[index]?.expandable {
            //0 because your first item starts at 0
            for i in 0...expansions.count {
                sideBarData?.insert(nil, at: index + i)
                tableView.insertRows(at: [NSIndexPath(row: index + i, section: 0) as IndexPath] , with: .top)
            }
        }
    }
person Jaime Sendra Domenech    schedule 23.06.2017

person    schedule
comment
Пожалуйста, немного объясните свой код, чтобы облегчить его будущим читателям. - person Failed Scientist; 25.06.2018