2016-04-20 14 views
2

So hatte ich eine Funktion wie folgt aus:Compiler-Fehler in schnellen indexOf get()

var localIndices: [ChartHighlight] = [] 

    for globalHighlight in globalIndices 
    { 
     if let globalSet = data?.dataSets[globalHighlight.dataSetIndex] 
     { 
      if globalSet.dynamicType === dataSetType 
      { 
       let chartData = getChartData(dataSetType) 

       if (chartData == nil) 
       { 
        return globalIndices 
       } 

       let localdataSetIndex = chartData!.dataSets.indexOf(globalSet) 
       if (localdataSetIndex != nil) 
       { 
        localIndices.append(ChartHighlight(xIndex: globalHighlight.xIndex, dataSetIndex: localdataSetIndex!, stackIndex: globalHighlight.stackIndex)) 
       } 
      } 
      else 
      { 
       return globalIndices 
      } 
     } 
    } 

Der Compiler bei

klagt

let localdataSetIndex = chartData!.dataSets.indexOf(globalSet)

sagen, dass

nicht Wert umwandeln kann vom Typ 'IChartDataSet' zum erwarteten Argumenttyp '@noescape (IChartDataSet) throws -> Bool'

Ich bin verwirrt, warum ich nicht normal indexOf() für [IChartDataSet] verwenden kann. Bezieht sich dies darauf, dass chartData!.dataSets[IChartDataset] ist, während IChartDataset ein Typ ist? ich nicht swift doc sehen dies zu erwähnen oder ich es verpasst ...

+1

Ist Ihr 'IChartDataSet' entspricht' Equatable'? Wahrscheinlich nicht, deshalb können Sie das übliche 'indexOf' nicht verwenden. –

+0

@AlexanderDoloz Ich habe überprüft, dass es nicht konform ist. Vielen Dank! – Wingzero

Antwort

3

als Eingangs param indexOf Methode mit dem Element verwenden zu können, Elementtyp dataSets die IChartDataSet ist muss Equatable Protokoll entsprechen, wie Sie von CollectionType sehen Erweiterungsdefinition:

extension CollectionType where Generator.Element : Equatable { 
     /// Returns the first index where `value` appears in `self` or `nil` if 
     /// `value` is not found. 
     /// 
     /// - Complexity: O(`self.count`). 
     @warn_unused_result 
     public func indexOf(element: Self.Generator.Element) -> Self.Index? 
    } 

Oder können Sie Prädikat Verschluss verwenden stattdessen:

let localdataSetIndex = chartData!.dataSets.indexOf { $0 === globalSet } 
+0

Vielen Dank. Eigentlich entwickle ich mich auf Basis eines Open-Source-Projekts https://github.com/danielgindi/Charts/. Ja IChartDatSet entspricht nicht Equatable. Können Sie ein Beispiel geben, wie Equatable in diesem Fall implementiert werden sollte? – Wingzero

+0

meine schnelle doc sagen (ich benutze Dash3) ist die Definition '@warn_unused_result func indexOf (_ Element: Self.Generator.Element) -> Self.Index?'. Hmm, schade, dass der Doc nicht korrekt ist. Ist diese schnelle 2.2 letzte Änderung? – Wingzero