2016-06-20 4 views
1

Ich habe ein paar verschiedene Arten von Strukturen (Promo & Event). Ich möchte ein leeres Array erstellen, das je nach dem Ergebnis einer if-Anweisung mit einem Array jedes Typs gefüllt wird.Swift initialisiert leeres Array um später verschiedene Strukturen zu speichern

So etwas wie folgt aus:

var dataArray:[Any] = [] // see options I've tried below 

if myTest == true { 
    dataArray = [Promo, Promo, Promo] 
} else { 
    dataArray = [Event, Event, Event]  
} 

ich verwendet haben versucht:

1. var dataArray: [Any] = [] 
2. var dataArray: [AnyObject] = [] 
3. var dataArray: [Any] = [Any]() 
4. var dataArray: [AnyObject] = [AnyObject]() 

aber wenn ich versuche, eine Reihe von Promo Structs zu speichern in dataArray bekomme ich einen Fehler Cannot assign value of type '[Promo]' to type '[Any]' usw.

Also, wie initialisiere ich ein Array, so dass es eine Vielzahl von (unbekannten) Structs speichern kann. Oder wie ändere ich meine Structs, damit sie in einem Array gespeichert werden können?

Ich habe wirklich Mühe zu sehen, was ich falsch mache, also wären alle Hinweise hilfreich.


Hier sind meine Structs: Promo.swift

import Foundation 

struct Promo { 

    // initialise the stored properties for use later 
    let promoId : Int 
    let date : NSDate 
    let title: String 
    let body: String 
    let busName : String 
    let busId : Int 
    let categoryId: Int 
    let featured: Bool 

    // a universal init() method which has optional parameters 
    init(promoId: Int, 
     date: NSDate, 
     title: String, 
     body: String, 
     busName: String, 
     busId: Int, 
     categoryId: Int, 
     featured: Bool 
     ){ 
     self.promoId = promoId 
     self.date = date 
     self.title = title 
     self.body = body 
     self.busName = busName 
     self.busId = busId 
     self.categoryId = categoryId 
     self.featured = featured 
    } 
} 

// allow us to compare structs 
extension Promo: Equatable {} 
func ==(lhs: Promo, rhs: Promo) -> Bool { 
    return lhs.promoId == rhs.promoId 
     && lhs.date == rhs.date 
     && lhs.title == rhs.title 
     && lhs.body == rhs.body 
     && lhs.busName == rhs.busName 
     && lhs.busId == rhs.busId 
     && lhs.categoryId == rhs.categoryId 
     && lhs.featured == rhs.featured 
} 

Event.swift

import Foundation 

struct Event { 

    // initialise the stored properties for use later 
    let eventId : Int 
    let date : NSDate 
    let title: String 
    let body: String 
    let busName : String 
    let busId : Int 
    let categoryId: Int 

    // a universal init() method which has optional parameters 
    init(eventId: Int, 
     date: NSDate, 
     title: String, 
     body: String, 
     busName: String, 
     busId: Int, 
     categoryId: Int 
     ){ 
     self.eventId = eventId 
     self.date = date 
     self.title = title 
     self.body = body 
     self.busName = busName 
     self.busId = busId 
     self.categoryId = categoryId 
    } 
} 
+0

In dem Beispiel ordnen Sie die Strukturen nicht dem DatenArray, sondern dem Typ zu. Wollten Sie stattdessen dataArray = [Promo(), Promo(), Promo()] usw.? –

+0

Ja, @CaseyFleser, das ist eigentlich was zugewiesen (Ich bekomme ein Array von Promo-Strukturen von einer Funktion zurückgegeben). Danke – James

+0

Mögliches Duplikat von [Warum ist nicht \ [SomeStruct \] konvertierbar in \ [Beliebige \]?] (Http://stackoverflow.com/questions/37188580/why-isnt-somestruct-convertible-to-any) – Hamish

Antwort

1

Wenn Sie dataArray von [Promo] oder [Event] Arrays zuweisen versuchen , könnten Sie map:

var dataArray:[Any] = [] 
var promoArray:[Promo] = [Promo(), Promo(), Promo()] 
var eventArray:[Event] = [Event(), Event(),Event()] 

if myTest == true { 
    dataArray = promoArray.map { $0 as Any } 
} else { 
    dataArray = eventArray.map { $0 as Any } 
} 

Oder erstellen Sie neue Any Arrays:

if myTest == true { 
    dataArray = Array<Any>(arrayLiteral: promoArray) 
} else { 
    dataArray = Array<Any>(arrayLiteral: eventArray) 
} 
+0

Danke @Casey Ich habe eine leicht modifizierte Version deines ersten .map-Snippets benutzt, das großartig funktioniert. Danke für Ihre Hilfe. – James

+1

Sicher, glücklich zu. –

1

Dies kann nicht genau, was Sie bestimmt, aber Sie können diese ein bisschen sauberer machen, indem Klassen statt structs verwenden. Es scheint, dass ein "Promo" nur ein "Event" mit einem zusätzlichen Datenelement (featured) ist ... Wenn das der Fall ist, können Sie das Promo.promoId-Feld Promo.eventId umbenennen und es dann zu einer Unterklasse von Event machen . Wie folgt aus:

class Promo : Event { 
    let featured: Bool 

    // a universal init() method which has optional parameters 
    init(eventId: Int, 
     date: NSDate, 
     title: String, 
     body: String, 
     busName: String, 
     busId: Int, 
     categoryId: Int, 
     featured: Bool 
     ){ 
     self.featured = featured 
     super.init(eventId: eventId, date: date, title: title, body: body, busName: busName, busId: busId, categoryId: categoryId) 
    } 
} 

Dann erstellen Sie einfach die Daten-Array wie folgt aus:

var dataArray = [Event]() 

if myTest == true { 
    dataArray = [promo1, promo2, promo3] 
} else { 
    dataArray = [event1, event2, event3] 
} 

Um die vorgestellten Element für eine Promo benutzen Sie noch benötigen, so werfen:

if let thisPromo = dataArray[0] as? Promo { 
    print(thisPromo.featured) 
} 
+0

Danke @Steve - Ich habe mich gefragt, aber das ist eine vereinfachte Version für SO.Es gibt tatsächlich 4 Strukturen mit ziemlich unterschiedlichen Mitgliedern (ich habe Events & Promos einfach kopiert, da sie die kürzesten sind) :-) Ich mag deine Idee und bin immer daran interessiert, Dinge zu vereinfachen, also werde ich darüber nachdenken. – James

Verwandte Themen