2016-03-10 96 views
-1

下面的代碼是爲了根據出版年份來對期刊出版物進行分組而編寫的。Swift 2 issue關閉groupBy集合

但我得到了錯誤「無法將類型的價值‘(雜誌) - >詮釋’到期望的參數類型‘(_) - > _’」

下面是用的一個精簡版的遊樂場真實代碼供你玩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

有很多簡單的麻煩與你的代碼。第一個是編譯器無法推斷分組日記的類型。使用let gropedJournals:Int = ....應該解決它。最糟糕的是,Journal沒有成員生成器.....只是繼續一步一步 – 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不同,但我已經有一個單純的groupBy很長時間。我試圖實現的是groupBy的漸進式reduce()版本。 –

+0

在我編輯的答案中看到'groupBy2' –

+0

我真的很想得到我的問題的答案。我該如何解決我在我的問題中討論的語法錯誤? @代碼不同 –