Всем переменным должно быть присвоено значение до инициализации. Поскольку у вашей тени нет значения, компилятор заставляет вас переопределить необходимый init, чтобы вы могли дать тени значение.
Чтобы это исправить, просто сделайте тень ленивой:
lazy var shadow =
{
[unowned self] in
let shadow = ShadowComponent(size: CGSize(width: 50, height: 50), offset: CGPoint(x: 0, y: -20))
addComponent(shadow)
return shadow
}()
Затем, при первом использовании тени, она создаст и добавит компонент для вас.
Единственная причина, по которой нам нужно сделать его ленивым, - это аспект addComponent. Ваш код может быть написан так, чтобы избежать необходимости использовать ленивый, но вам нужно будет вызвать функцию для добавления вашего компонента.
let shadow = ShadowComponent(size: CGSize(width: 50, height: 50), offset: CGPoint(x: 0, y: -20))
func addComponents(){
addComponent(shadow)
}