2015-03-12 4 views
1

У меня есть следующий класс, который является подклассом SKLabelNode. Этот класс не будет работать безПодклассификация ошибки SKLabelNode с Swift

override init(){ 
     super.init() 
    } 

звонок. Кажется, что SKLabelNode пытается вызвать метод init() без параметров или что-то еще происходит где-то, что вызывает эту проблему.

Это упрощенный класс.

import UIKit 
import SpriteKit 

class PulsatingText: SKLabelNode { 

    override init(){ 
     super.init() 
    } 

    init (fontNamed:String!, theText: String!, theFontSize: CGFloat!){ 
     super.init(fontNamed: fontNamed) 
     self.text = theText 
     self.fontSize = theFontSize 
    } 


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

Если я удалить

override init(){ 
      super.init() 
     } 

я получаю во время выполнения аварии со следующей ошибкой вошли в консоль.

фатальная ошибка: использование нереализованного инициализатора «Init()» для класса «MobileTutsInvaderz.PulsatingText»

Вот как я вызываю метод.

пусть invaderText = PulsatingText (fontNamed: "ChalkDuster", ЬЬеТехЬ: "INVADERZ", theFontSize: 50)

Я также включающий в себя изображение трассировки стека ниже.

,

+0

Инициализатор по умолчанию для 'SKLabelNode' является' init (fontNamed fontName: String!) ', Вы пытались его переопределить? –

+0

Можете ли вы показать код, который вызывает этот класс? –

+0

@ AndyHeard Я опубликовал сообщение, чтобы показать, что я называю класс. – james

ответ

2

Вы должны инициализировать метод init(). Поскольку метод по умолчанию init() вызывается каждый раз при инициализации SKLabelNode. Вы можете проверить это путем реализации override init() и добавить println заявление так:

override init() { 
    super.init() 
    println("test") 
} 

Если теперь инициализировать в labelnode так:

var label:PulsatingText = PulsatingText(fontNamed: "Arial", theText: "hey", theFontSize: 12) 

println("test") будет вызван.

+0

Имеет смысл, что init будет вызван в конце концов, но странно, что он вызывает метод init() подкласса. – james

+1

Можете ли вы объяснить, почему это вызвало бы метод подкласса init().? Я пытаюсь понять, почему он работает таким образом. Спасибо – james

+0

Я согласен, что это странно. Иногда Свифт не подчиняется здравому смыслу. – johnbakers

1

Поскольку вы хотите добавить инициализатор convenience и оставить остальное как есть, вам не нужно переопределять назначенные инициализаторы. Поэтому просто измените свой код следующим образом:

class PulsatingText: SKLabelNode { 

    convenience init (fontNamed:String!, theText: String!, theFontSize: CGFloat!){ 
     self.init(fontNamed: fontNamed) 
     self.text = theText 
     self.fontSize = theFontSize 
    } 
} 
+0

Это дает ошибку, и я на самом деле делаю немного больше, чем это. Я упростил метод init. Чтобы понять, почему вызывался вызов super.init(). – james

+0

Что такое версия XCode, которую вы используете? Я использую 6.2. Можете ли вы добавить свою ошибку? –

Смежные вопросы