Q:

SpriteKit - create sprite in Gamescene.sks and reference in another class

I know I can use the following in GameScene.swift to reference a sprite I created in the level editor:
ball = childNode(withName: "ball") as? SKSpriteNode

what if I want to reference that ball from a Ball class? Below is what I thought would work. I was wrong. In the level editor I've given the ball the custom class of Ball.

1. I've created a ball sprite in GameScene.sks and assigned it the Custom Class of Ball:

This is my custom Ball class. (You can ignore the contents, because it doesn't work.)
class Ball: SKSpriteNode {

  init() {
    let size = CGSize(width: 35, height: 35)
    super.init(texture: nil, color: UIColor.clear, size: size)

  }

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

  func moveBall() {
    self.position = CGPoint(x: 50, y:50)
  }
}

Then, in GameScene.swift, I'd like to use the Ball function moveBall() I defined.
class GameScene: SKScene {
  var ball = Ball()
  override func didMove(to view: SKView) {
    ball.moveBall()
  }  
}

A:

Edit

If you want to add an custom object to the Scene editor you need to add the following initializer to your custom class.
class Ball: SKSpriteNode {

  required init?(coder aDecoder: NSCoder) {
    super.init(coder: aDecoder)
  }

  func moveBall() {
    self.position = CGPoint(x: 50, y:50)
  }
}

the init() func is only used when you are creating a new object in code. Which is actually what you are doing in block 3 which goes completely against your question about referencing a sprite from the Scene editor.
You can delete the init() if you want, unless you have plans to add objects via code at another time
you then need to reference the object you added in the Scene editor. In block 3 you are not referencing that object, you are creating a new object.
class GameScene: SKScene {

  private var ball: Ball

  override func didMove(to view: SKView) {

    if let ball = childNode(withName: "ball") as? Ball {
        self.ball = ball
        ball.moveBall()
    }  
}

Original Answer

You haven't shown us anywhere that the object initBall gets called
You'll need to ensure that your subclass file has the proper initializer if you are adding in the Scene Editor
required init?(coder aDecoder: NSCoder) {
    super.init(coder: aDecoder)
}

What I do is either call a setup file from the subclass required init or call it from code if it needs a variable for setup
required init?(coder aDecoder: NSCoder) {
    super.init(coder: aDecoder)

    setup()
}

func setup() {

    ball = childNode(withName: "ball") as? SKSpriteNode
    ball.size = CGSize(width: 35, height: 35)
}

or
required init?(coder aDecoder: NSCoder) {
    super.init(coder: aDecoder)
}

func setupWith(variable: SomeVariableType) {

    if variable == x {

        //setup based on variable
    }
    else {

        //setup based on variable
    }
}

...in your Scene...

if let ball = childNode(withName: "ball") as? Ball {
    self.ball = ball

    ball.setup(variable: someVarHere)  
}

