2016-02-25 2 views
4

меня создать следующую структуру для отображения TableView:Фильтрация 2D массив объектов в Swift

struct Section {  
    var heading : String 
    var items : [MusicModel] 
    init(category: String, objects : [MusicModel]) {   
     heading = category 
     items = objects 
    } 
} 

Тогда у меня есть следующие функции для добавления объектов в массив:

var sectionsArray = [Section]() 

func getSectionsFromData() -> [Section] { 
    let basicStrokes = Section(category: "Basic Strokes", 
    objects: [MusicModel(title: Title.EightOnAHand, author: .None, snare: true, tenor: true)]) 

    sectionsArray.append(basicStrokes) 
    return sectionsArray 
} 

Так tableview загружается просто отлично с заголовком раздела и строками для данных. Я хочу, чтобы иметь возможность фильтровать ячейки таблицы, но мне трудно найти правильный синтаксис для фильтрации массива объектов на основе выбранного пользователем инструмента, который отправляется на функцию фильтрации. Вот что у меня есть:

func getMusic(instrument: MusicData.Instrument) -> [Section] { 
    if instrument == .Tenor { 
     let filtered = sections.filter {$0.items.filter {$0.tenor == true}} 
     return filtered 
    } else { 
     let filtered = sections.filter {$0.items.filter {$0.snare == true}} 
     return filtered 
    } 
} 

Объект возвращается, только если ловушка или тенор верны. Ошибка, которую я получаю: Невозможно вызвать «фильтр» с списком аргументов типа »(@noescape (MusicModel) throws -> Bool) '

Любая идея? Если у вас есть предложение по лучшему способу сделать это, я бы очень признателен. Благодаря!

ответ

2

Используйте этот обновленный метод getMusic,

func getMusic(instrument: MusicData.Instrument) -> [Section] { 
    if instrument == .Tenor { 
     var filtered = sections.filter {$0.items.filter {$0.tenor == true}.count > 0} 
     filtered = filtered.map({ (var section: Section) -> Section in 
      section.items = section.items.filter {$0.tenor == true} 
      return section 
     }) 
     return filtered 
    } else { 
     let filtered = sections.filter {$0.items.filter {$0.snare == true}.count > 0} 
     filtered = filtered.map({ (var section: Section) -> Section in 
      section.items = section.items.filter {$0.snare == true} 
      return section 
     }) 
     return filtered 
    } 
} 
+0

Это решение сработало. Благодаря! –

0

Или следующий один. (Будьте осторожны, чтобы ваш раздел был struct, что означает, что он будет скопирован.)

func getMusic(instrument: MusicData.Instrument) -> [Section] { 
     return sections.map { (var s: Section) -> Section in 
      s.items = s.items.filter { instrument == .Tenor ? $0.tenor : $0.snare } 
      return s 
     } 
    } 
+0

Хорошая точка со структурой. Благодаря! –

Смежные вопросы