嵌套数组错误

时间:2017-07-05 06:22:50

标签: swift

我知道这是一个非常新手的问题,但它已经让我好几天了,我似乎无法找到一个我真正理解的解决方案。

我正在尝试创建一个嵌套数组来存储纬度和经度,但是Xcode / playground会抛出EXC_BAD_INSTRUCTION错误。

我想声明,初始化和打印数组的内容。我做错了什么?

var arrayLocations:[[Float]] = []

arrayLocations[0] = [27.1750199, 78.0399665]

print("\(arrayLocations[0][0]) and \(arrayLocations[0][1])")

3 个答案:

答案 0 :(得分:7)

您无法为索引0分配值,因为如果数组为空,则没有索引0。

您必须appendinsert该项:

arrayLocations.append([27.1750199, 78.0399665])

答案 1 :(得分:0)

正如vadiananswer

上所说的那样
  

您无法为索引0分配值,因为如果没有索引0   数组是空的。

     

您必须追加或插入该项目:

     

arrayLocations.append([27.1750199,78.0399665])

我建议您使用此Collection extension,这样您的代码就不会经常崩溃

extension Collection where Indices.Iterator.Element == Index {

    /// Returns the element at the specified index if it is within bounds, otherwise nil.
    subscript (safe index: Index) -> Generator.Element? {
        return indices.contains(index) ? self[index] : nil
    }
}

通过使用此功能,您只需使用if let

即可

样品:

if let aLocation = arrayLocations[safe: 0] {
    aLocation = [27.1750199, 78.0399665]
}

这确保即使您尝试访问索引0的对象,您的代码也不会崩溃。

建议:

注意:此建议不是答案的一部分,而是改进代码的内容。

看起来你正在尝试创建一个纬度和经度数组。为latitude and longitude对象使用数组并不是很明智。我建议您创建一个对象,它可以是structtypeAlias

例如:

struct CoordinateStruct {
    var longitude: Float
    var latitude: Float
}

/* or */

typealias CoordinateTypeAlias = (latitude: Float, longitude: Float)

/************************* */

// Your code would then look like this
var arrayLocations:[CoordinateStruct] = []
arrayLocations.append(CoordinateStruct(longitude: 27.12312312, latitude: 78.123123))

/* or */ 

var arrayLocations:[CoordinateTypeAlias] = []
arrayLocations.append((27.12312312, 78.123123))

// Which would make accessing them very easy and readable, like this.

if let aLocation = arrayLocations[safe: 0] {
    print(aLocation.longitude)
    print(aLocation.latitude)

    // instead of this 
    print(aLocation[0]) // a person who reads your code won't understand this
    print(aLocation[1]) // a person who reads your code won't understand this
}

答案 2 :(得分:0)

您无法将值分配到0位置,因为索引0为空。

您可以通过以下方式执行此操作 -

初始值 -

var arrayLocations:[[Float]] = [[0.00,0.00]]

arrayLocations[0] = [27.1750199, 78.0399665]

print("\(arrayLocations[0][0]) and \(arrayLocations[0][1])")

否则,您可以使用appendinsert作为vadian的答案来执行此操作。