我对Swift很陌生,我试图将我的数据存储为2D AnyObject数组。我已声明var internalData = [[AnyObject]]()
和结构如此:
struct WiFiData {
var latency: Double
var duration: Double
}
现在,在另一个函数中,我想打开实例变量currentExit,这是一个枚举:
private var currentExit = Exit.A
enum Exit {
case A
case B
case C
case NotSelected
}
func someFunc() {
switch self.currentExit {
case .A:
self.internalData[0].append(WiFiData(latency: 1.5, duration: 4.0) as AnyObject) // <- CRASHES ON THIS LINE
......// other cases
}
但是,它总是在self.internalData[0].append(WiFiData(latency: 1.5, duration: 4.0) as AnyObject)
行崩溃,并出现以下错误:
致命错误:索引超出范围
谁能告诉我为什么以及如何解决这个问题?感谢任何帮助,谢谢!
答案 0 :(得分:2)
没有&#34; 2D阵列&#34;在斯威夫特。有阵列阵列,它们是不同的。例如,没有承诺每行在数组数组中具有相同数量的列。
在您的情况下,问题是internalData
中没有元素。必须先创建一个internalData[0]
元素,然后才能追加它。您var internalData = [[AnyObject]]()
的分配意味着没有元素0.它是一个空数组(数组)。
另请注意,[[AnyObject]]
类型很可能会给您带来很多问题。 AnyObject
对于使用Cocoa API非常有用,但通常会产生很多麻烦,很少会成为Swift属性的一部分。您几乎肯定会创建一些更具体的类型来保存您的数据。从您的示例中不清楚您期望internalData
持有什么。但是,您的代码表明,您的意思更像是:
var internalData: [Exit: [ExitRecord]] = [:]
enum Exit {
case A
case B
case C
case NotSelected
}
enum ExitRecord {
case wifi(latency: Float, duration: Float)
}
func someFunc() {
switch self.currentExit {
case .A:
var currentRecords = internalData[.A] ?? []
currentRecords.append(.wifi(latency: 1.5, duration: 4.0))
internalData[.A] = currentRecords
......// other cases
}
答案 1 :(得分:2)
您使用[[AnyObject]]()
实例化了一个二维数组,但它仍然是空的,这意味着self.internalData[0]
没有任何内容可供您追加。你可以做很多事情来解决这个问题,但是如果你知道你在self.internalData
内有3个数组,你可以像这样实例化每个内部数组:
self.internalData = [[AnyObject](), [AnyObject](), [AnyObject]()]
现在,self.internalData[0]
处有一个空数组,您可以将项目附加到。
但是,似乎如果你已经知道你将拥有3个WiFiData
数组,那么创建3个变量会更好:
var a = [WiFiData]()
var b = [WiFiData]()
etc.
然后您可以按名称访问各个数组。