I want to create a SKShapeNode at a higher level than the touchesBegan of a SpriteNode so when I want to add the SKShapeNode to the screen from the touchesBegun event on this sprite, the shape already exists, and I simply add it to the screen from within the touchesBegan override.

TL;DR, in my SKSpriteNode, I'm trying to pre-build the SKShapeNode that will be used as an animated ring when the Sprite is touched.

I'd like to create the SKShapeNode with variable/constants, so I can easily edit its values...

So in the root of the subclass I have variables for color, size, and linewidth, ready to be used in the creation of the SKShapeNode...

```
class Balls: SKSpriteNode {

    var ringSize: CGFloat = 64
    var ringColor: SKColor = SKColor.white
    var ringWidth: CGFloat = 16

....

```

Further down, but still at the root of the class, I create my ring:

```
 let ring = SKShapeNode(circleOfRadius: ringSize)

```

And am instantly greeted with the lovingly cryptic:

> 
> **Can not use instance member 'ringSize' within property initializer,
>  property initializers run before 'self' is available.**
> 
> 
> 

Fine. Ok. I get it. You want to think that a functional call to a class to create a property should be done before values are assigned to self. Neither here nor there, I think I'm getting cunning and can get around that by wrapping everything in a function:

```
class Balls: SKSpriteNode {

        var ringSize: CGFloat = 64
        var ringColor: SKColor = SKColor.white
        var ringWidth: CGFloat = 16

        var myRing = SKShapeNode()    

    func createRing() -> SKShapeNode{
            let ring = SKShapeNode(circleOfRadius: ringSize)
                ring.strokeColor = ringColor
                ring.lineWidth = ringWidth
            return ring
        }

```

This generates no errors, and my excitement builds.

So I add another line, to create the actual ring:
 ....

```
 myRing = createRing()

```

Dead again: 

> 
> **! Expected
>  declaration**
> 
> 
> 

I have absolutely no idea what this means and began to randomly attempt weird things. 

One of them is heading into my already messy convenience initializer and adding `myRing = createRing()` in there... and ***this WORKS!***

**How and why does this work, and is this the best/right/proper way to be circling the drain of initialization?**

:: EDIT:: UPDATE :: Full Code Context ::
----------------------------------------

Here's the full class with my bizarre and misunderstood initialisers. 

```
import SpriteKit

class Circle: SKSpriteNode {

    var ringSize: CGFloat = 96
    var ringColor: SKColor = SKColor.white
    var ringWidth: CGFloat = 8

    var myRing = SKShapeNode()

    override init(texture: SKTexture?, color: UIColor, size: CGSize) {
        super.init(texture: texture, color: color, size: size)
    }

    convenience init() {
        self.init(color: SKColor.clear, size: CGSize(width: 100, height: 100))
        myRing = createRing()
        addChild(myRing)
        print("I'm on the screen")
        explodeGroup = create_explosionActionGroup()
        }

    convenience init(color: UIColor, size: CGSize, position: CGPoint) {
        self.init(color: color, size: size)
        self.position = position

        myRing = createRing()
        explodeGroup = create_explosionActionGroup()

    }
    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

    func createRing() -> SKShapeNode{
        let ring = SKShapeNode(circleOfRadius: ringSize)
        ring.strokeColor = ringColor
        ring.lineWidth = ringWidth
        return ring
    }

```