Arrays and Swift

2020-02-07 04:51发布

问题:

I'm trying to deal with an app in Swift and I'm facing the following error using arrays:

fatal error: Array index out of range

This appears when apps assign a value to the array at index 0:

class DrawScene: SKScene {

    init(size: CGSize) {
        super.init(size: size)
    }

    var line = SKShapeNode()
    var path = CGPathCreateMutable()
    var touch: UITouch!
    var pts = [CGPoint]()

    override func touchesBegan(touches: NSSet, withEvent event: UIEvent) {
        /* Called when a touch begins */
        touch = touches.anyObject() as UITouch!
        self.pts[0] = touch.locationInNode(self)  <-- Error appears here
        drawLine()
    }

Some ideas? (I'm using xcode 6 Beta 4)

回答1:

Your array is empty at first.

if self.pts.isEmpty {
    self.pts.append(touch.locationInNode(self))
}
else {
    self.pts[0] = touch.locationInNode(self)
}


回答2:

As it says in the docs:

“You can’t use subscript syntax to append a new item to the end of an array. If you try to use subscript syntax to retrieve or set a value for an index that is outside of an array’s existing bounds, you will trigger a runtime error.”

You'll have to use append or += to add to an empty array. If you always want to set this point to the first object in the array, replacing anything already there, you'll have to check the count of the array first.



回答3:

I don't recommend this to anyone, but you could implement your own subscript that allows you to do this:

extension Array {
    subscript(safe index: Int) -> Element? {
        get {
            return self.indices.contains(index) ? self[index] : nil
        }

        set(newValue) {
            guard let newValue = newValue { return }

            if self.count == index {
                self.append(newValue)                   
            } else {
                self[index] = newValue
            }
        }
    }
}

And you can use this as expected:

var arr = [String]()

arr[safe: 0] = "Test"
arr[safe: 1] = "Test2"
print(arr) // ["Test", "Test2"]

arr[safe: 0] = "Test0"
print(arr) // ["Test0", "Test2"]

arr[safe: 3] = "Test2" // fatal error: Index out of range