NSSet не имеет элементов индекса

У меня есть объект CoreData с отношением NSSet. Я пытаюсь использовать это как источник данных, но получаю следующее

    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

    let cell = playerTableView.dequeueReusableCellWithIdentifier("Cell")! as UITableViewCell
    cell.textLabel?.text = self.game.players[indexPath.row]
    return cell
}

Как мне использовать свой NSSet в tableView, и я полагаю, что это будет неупорядочено, поэтому каждый раз может быть разным, так как я могу заказать этот набор?


person Jonnny    schedule 09.10.2016    source источник
comment
Если вы хотите навести порядок в наборе, вам следует загрузить элементы в массив.   -  person Tim Vermeulen    schedule 09.10.2016
comment
@TimVermeulen Да, я начал смотреть на это, оно второе в моем списке. Думаю, я мог бы упорядочить объекты CoreData по имени в массиве?   -  person Jonnny    schedule 09.10.2016
comment
Например, да.   -  person Tim Vermeulen    schedule 09.10.2016


Ответы (3)


Вы можете использовать allObjects для получения массива из набора и последующей сортировки объектов.

let orderedPlayers = (game.players!.allObjects as! [Player]).sort { $0.name < $1.name }

Если вы объявите набор как собственный тип Swift Set<Player> — CoreData также поддерживает типы Swift — вы даже можете опустить приведение типа и allObjects:

let orderedPlayers = game.players!.sort { $0.name < $1.name }
person vadian    schedule 09.10.2016

Вот как я это сделал:

for player in game.players! {
        orderedPlayers.append(player as! Player)
    }
    orderedPlayers.sortInPlace({ $0.name < $1.name })
person Jonnny    schedule 09.10.2016

Вы можете добавить subScript к базовому классу данных game следующим образом:

subscript(index: Int) -> Player? {
    let descriptor = NSSortDescriptor(key: "name", ascending: true)
    let orderedPlayerArray = players?.sortedArray(using: [descriptor])
    let playerWhereIndex = orderedPlayerArray?[index]
    return playerWhereIndex as? Player
}
person Saeed    schedule 20.05.2021