2017-02-28 3 views
1

Ich möchte eine Erweiterung zu Array (oder Sequenz oder Collector?) Definieren, so dass ich eine Liste von Listen eines benutzerdefinierten Objekts mit einem NSIndexPath abfragen und das Objekt basierend auf dem Abschnitt indexPath abrufen kann und Reihe.Swift generische Erweiterung für ein Array in Array

public var tableViewData = [[MyCellData]]() // Populated elsewhere 

public func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
    var tableViewCellData = tableViewData.data(from: indexPath) 
    // use tableViewCellData 
} 

// This does not compile as I want the return type to be that of which is the type "in the list in the list" (i.e. MyCellData) 
extension Sequence<T> where Iterator.Element:Sequence, Iterator.Element.Element:T { 
    func object(from indexPath: NSIndexPath) -> T { 
     return self[indexPath.section][indexPath.row] 
    } 
} 

Antwort

3
  • A Sequence kann nicht über Index indiziert werden, so dass Sie ein Collection benötigen.
  • Die Sammlungselemente müssen ebenfalls Sammlungen sein.
  • Seit .row, .section sind Int, die Sammlung und seine verschachtelte Sammlung muss durch Int indiziert werden. (Dies ist der Fall für viele Sammlungen, zB Arrays oder Array-Slices. String.CharacterView ein Beispiel für eine Sammlung, die nicht von Int indiziert ist.)
  • Sie brauchen keine generischen Platzhalter (und extension Sequence<T> ist nicht Swift 3 Syntax gültig). Geben Sie einfach den Rückgabetyp als Elementtyp der verschachtelten Auflistung an.

es Putting alles zusammen:

extension Collection where Index == Int, Iterator.Element: Collection, Iterator.Element.Index == Int { 
    func object(from indexPath: IndexPath) -> Iterator.Element.Iterator.Element { 
     return self[indexPath.section][indexPath.row] 
    } 
} 
+0

Dank! Genau das, was ich gesucht habe! – Sunkas