Swift初始化空数组以便稍后存储不同的结构

时间:2016-06-20 14:26:46

标签: arrays swift

我有几种不同类型的结构(Promo& Event)。我想创建一个空数组,根据if语句的结果填充每种类型的数组。

这样的事情:

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

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

我尝试过使用:

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

但是当我尝试在Promo中存储dataArray个结构数组时,我收到错误Cannot assign value of type '[Promo]' to type '[Any]'等。

那么,我如何初始化一个数组,以便它可以存储各种(未知的)Structs。或者我如何修改我的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
    }
}

2 个答案:

答案 0 :(得分:1)

如果您尝试从dataArray[Promo]数组分配到[Event],则可以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 }
}

或者创建新的Any数组:

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

答案 1 :(得分:1)

这可能不完全符合您的意图,但您可以通过使用类而不是结构来使其更清晰。它似乎是一个&#39;促销&#39;只是一个&#39;事件&#39;有一个额外的数据成员(特色)......如果是这样,那么你可以重命名Promo.promoId字段Promo.eventId,然后将其作为Event的子类。像这样:

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)
    }
}

然后就像这样创建数据数组:

var dataArray = [Event]()

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

要使用推荐会员作为促销,您仍然需要像这样投射:

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