2016-03-10 1 views
-1

Код, указанный ниже, предназначен для группировки публикаций в журналах по годам выпуска.Свифт 2 выпуск с закрытием для коллекции groupBy

Но я получил сообщение об ошибке «Не удается преобразовать значение типа„(журнал) -> Int“ожидаемого типа аргумента„(_) -> _“»

Вот площадка с усеченную версию из настоящий код для игры http://swiftlang.ng.bluemix.net/#/repl/1de81132cb2430962b248d2d6ff64922e2fe912b1480db6a7276c6a03047dd89

class Journal { 

    var releaseDate: Int = 0 

    static var journals = [Journal]() 

    class func groupedReduce<S: SequenceType, K: Hashable, U> (
     source: S, 
     initial: U, 
     combine: (U, S.Generator.Element) -> U, 
     groupBy: (S.Generator.Element) -> K 
    ) 
     -> [K:U] 
    { 
     var result: [K:U] = [:] 

     for element in source { 
      let key = groupBy(element) 
      result[key] = combine(result[key] ?? initial, element) 
     } 

     return result 
    } 



    class func groupBy() { 

     let byYear = { (journal: Journal) in 
      journal.releaseDate 
     } 

     let groupedJournals = groupedReduce(journals, initial: 0, combine:+, groupBy: byYear) 

     print("Grouped journals = \(groupedJournals)") 
    } 
} 



Journal.journals = [Journal(), Journal(), Journal(), Journal()] 

for j in Journal.journals { 
    j.releaseDate = 1 
} 


Journal.groupBy() 
+0

есть более чем простая проблема с кодом. первый заключается в том, что компилятор не может вывести тип groupedJournals. используя let gropedJournals: Int = .... должен решить эту проблему. Хуже всего то, что у Журнала нет генератора-члена ... просто продолжайте шаг за шагом – user3441734

+0

другой проблемой является то, что оператор + ожидает, что оба операнда и результат будут одного типа ... – user3441734

+0

Вы смешиваете вещи. S - это SequenceType, @ user3441734 –

ответ

0

Ваш код является чрезмерно сложным. Ниже приведена функция groupBy, которая группирует элементы массива в соответствии с выбранными вами критериями. Playground

import Foundation 

class Journal { 
    var releaseDate: Int = 0 

    init(_ releaseDate: Int) { 
     self.releaseDate = releaseDate 
    } 
} 

extension Array { 
    func groupBy<T: Hashable>(f: Element -> T) -> [T: [Element]] { 
     var results = [T: [Element]]() 

     for element in self { 
      let key = f(element) 
      if results[key] == nil { 
       results[key] = [Element]() 
      } 
      results[key]!.append(element) 
     } 

     return results 
    } 

    func groupBy2<T: Hashable>(f: Element -> T) -> [T: [Element]] { 
     return self.reduce([T: [Element]]()) { (var aggregate, element) in 
      let key = f(element) 
      if aggregate[key] == nil { 
       aggregate[key] = [Element]() 
      } 

      aggregate[key]!.append(element) 
      return aggregate 
     } 
    } 
} 


let journals = [Journal(2015), Journal(2016), Journal(2015), Journal(2014)] 
let groupedJournals = journals.groupBy { 
    $0.releaseDate 
} 

print(groupedJournals) 
+0

Спасибо @Code Different, но у меня уже есть просто groupBy. То, что я пытаюсь достичь, - это усовершенствованная версия() версии groupBy. –

+0

См. 'GroupBy2' в моем отредактированном ответе –

+0

Я действительно хотел получить ответ на мой вопрос. Как я могу исправить синтаксическую ошибку, о которой я говорю в своем вопросе? @Code Разное –

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