gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-11-01 06:38:57 25 4
gpt4 key购买 nike

我有几种不同类型的结构(促销和事件)。我想创建一个空数组,根据 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]()

但是当我尝试在 dataArray 中存储 Promo 结构数组时,出现错误 Cannot assign value of type '[Promo]' to type ' [任何]'

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

最佳答案

这可能不是您想要的,但是您可以通过使用类而不是结构来使它更清晰一些。看来“促销”只是一个带有一个额外数据成员(特色)的“事件”...如果是这样,那么您可以重命名 Promo.promoId 字段 Promo.eventId,然后使其成为事件的子类.像这样:

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

关于arrays - Swift 初始化空数组以稍后存储不同的结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37925061/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com