2016-07-17 4 views
0

Ich habe eine Struktur namens trip.Verschiedene Strukturen in einem Array in Swift

struct trip { 
    var name: String 
    var description: String 
    var elements: [Any] = [] 

    mutating func addItemToElements(newValue: Any) { 
     elements.append(newValue) 
    } 
} 

Wie Sie sehen können, gibt es ein Array im Inneren. Ich füge einige andere Strukturen wie element_flight in dieses Array von Funktion addItemtoElements.

struct element_flight { 
    var origin: String 
    var destination: String 
    var flightno: String 
    var departure: NSDate 
    var arrival: NSDate 
    var seat: String 
} 

Dann versuche ich, eine Liste mit Tabellenansicht zu erstellen:

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
    let cell = tableView.dequeueReusableCell(withIdentifier: "elementTrip", for: indexPath) as! CellInElementsOfTripsTableViewCell 
    let elem = trips[0].elements[indexPath.row] 
    cell.mainTextLabel.text = elem.origin //it doesn't work 

    return cell 
} 

ich alle Teile der Struktur erhalten kann nicht (wie origin in Code). Was mache ich falsch?

Ich erstelle ähnliche Strukturen zu element_flight und es könnte der beste Weg sein, es in ein Array zu setzen und dann in der Tabellenansicht anzuzeigen.

+0

'Versuche cast' sie auf den richtigen Typ oder zu speichern, welche Art sie sind, und werfen sie richtig auf die konkrete Art . Im Moment weiß der Compiler, dass 'elem' vom Typ' Any' on line ist: 'let elem = trips [0] .elements [indexPath.row]'. – Brandon

Antwort

2

Eine einfache, wäre naiv Lösung elem auf den richtigen Typ zu werfen sein:

cell.mainTextLabel.text = (elem as! element_flight).origin 

Da jedoch die elements Array Any speichern kann, was passiert, wenn elem ist eine andere Art? Offensichtlich wird es zusammenbrechen!

Ich verstehe nicht, warum Sie eine Reihe von Any in elements speichern möchten. Dies ist ein Zeichen oder ein schlechter Code. Any wird in Swift selten verwendet.

Wenn Sie nur ein paar Typen speichern gehen, aber nicht Any Arten, in elements, ein Protokoll erstellen und alle Arten machen, dass Sie es konform gespeichert werden sollen. Zumindest bekommst du ein bisschen Typsicherheit. Geben Sie an, dass Ihr Array nur zwei Strukturen enthält: element_flight und SomeOtherStruct. Sie sollten etwas tun:

protocol SomeProtocol { // please give this a proper name yourself 
    // properties/methods that are common among element_flight and SomOtherStruct 
} 

struct element_flight: SomeProtocol { 
    // ... 
} 

struct SomeOtherStruct: SomeProtocol { 
    // ... 
} 

Und das Array ändern [SomeProtocol] vom Typ zu sein.

Jetzt im cellForRowAtIndexPath Methode, müssen Sie prüfen, ob elem ist element_flight oder SomeOtherStruct:

if let flight = elem as? element_flight { 
    cell.mainTextLabel.text = flight.origin 
} else if let someOtherStuff = elem as? SomeOtherStruct { 
    // do some other stuff 
} else { 
    // something's wrong if this is executed, maybe call fatalError 
} 
+0

Es war sehr hilfreich, jetzt funktioniert es wie ein Zauber. Vielen Dank! – kkarol

0

Sie sollten sie in FlightInfo umwandeln (verwenden Sie diesen Namen anstelle von element_flight - Typname in Swift sollte in CamelCase geschrieben werden).

override func tableView(_ tableView: UITableView, 
      cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
    let cell = tableView.dequeueReusableCell(withIdentifier: "elementTrip", 
        for: indexPath) as! CellInElementsOfTripsTableViewCell 

    if let flightInfo = trips[0].elements[indexPath.row] as? FlightInfo { 
    cell.mainTextLabel.text = flightInfo.origin //it doesn't work 
    } 

    return cell 
} 
+2

Tatsächlich befindet sich 'FlightInfo' in _PascalCase_. – Sweeper