2014-06-06 16 views
6

Jestem bardzo początkującym programistą dla systemu iOS, ale bawię się z aplikacją szablonu SpriteKit, aby dowiedzieć się, jak działają i próbować uruchomić system Swift, gdy jestem na tym komputerze. Jedną z rzeczy, z którą mam problem, jest praca z podklasami SpriteKit.Klasy Subklasowania SpriteKit w Swift

Jestem w pliku GameScene.swift i próbuję wydobyć klasę na etykiecie „Hello World”, tak oto co ten plik wygląda następująco:

// GameScene.swift 

import SpriteKit 

class HelloLabel: SKLabelNode { 
    init(fontNamed: String) { 
     super.init(fontNamed: fontNamed) 
     self.text = "Hello, World!" 
     self.fontSize = 65; 
     self.position = CGPoint(x: 400, y: 500); 
    } 
} 

class GameScene: SKScene { 
    override func didMoveToView(view: SKView) { 
     /* Setup your scene here */ 
//  let myLabel = SKLabelNode(fontNamed:"Chalkduster") 
//  myLabel.text = "Hello, World!"; 
//  myLabel.fontSize = 65; 
//  myLabel.position = CGPoint(x: 400, y: 500); 

     let myLabel = HelloLabel(fontNamed: "Chalkduster") 
     self.addChild(myLabel) 
    } 

    override func touchesBegan(touches: NSSet, withEvent event: UIEvent) { 
     /* snip, no changes made here */ 
    } 

    override func update(currentTime: CFTimeInterval) { 
     /* snip, no changes made here */ 
    } 
} 

Więc HelloLabel jest przeznaczona po prostu być pass-through, próbując zrozumieć, jak razem przewody wszystko, ale kiedy uruchomić aplikację, pojawia się następujący błąd:

/Users/jon/Projects/ErrorExample/ErrorExample/GameScene.swift: 11: 11: fatal error: use of unimplemented initializer 'init()' for class 'ErrorExample.HelloLabel' 

ja nie rozumiejąc, co ta wiadomość próbuje mi powiedzieć . Sposób, w jaki czytam ten błąd, polega na tym, że narzekałem, że nie zaimplementowałem inicjalizatora o nazwie init w klasie ErrorExample.HelloLabel, ale na pewno wygląda na to, że muszę do mnie!

Co ja tu robię źle - jak wypakować klasę, aby ukryć wszystkie ustawienia?

Odpowiedz

11

nie jestem pewien dokładnie dlaczego, ale ukrytą funkcjonalność wewnątrz SKLabelNode próbował wywołać funkcję startowy bez parametrów. To wydaje się działać:

class HelloLabel: SKLabelNode { 
    init() { 
     super.init() 
    } 

    init(fontNamed fontName: String!) { 
     super.init(fontNamed: fontName) 
     self.text = "Hello, World!" 
     self.fontSize = 65; 
     self.position = CGPoint(x: 400, y: 500); 
    } 
} 
+0

Awesome, thanks za pomoc !! :) – jonallured

0

Być może od superklasy oczekuje się, że NSString* zmiana init(fontNamed: String) { na init(fontNamed: NSString) { rozwiąże problem?

Albo inna możliwość mogłaby za pomocą mostków obj-c:

init(fontNamed: String) { 
    super.init(fontNamed: fontNamed.bridgeToObjectiveC()) 
    ... 
} 
+0

Dzięki Jiaaro, ale gdy dodać, że słowa kluczowego, a następnie pojawia się ten błąd: „override” nie jest ważny w tej deklaracji. – jonallured

+0

oh masz 100% racji - init nie wymaga 'override' – Jiaaro

+0

@jonallured ok może jest to rzecz typu - ponieważ typem argumentu jest' String', a superklasa oczekuje 'NSString *' – Jiaaro

-1

Musisz najpierw wykonać inicjalizację klasy, a następnie zainicjować superklasę. Więc init() powinna wyglądać następująco:

init(fontNamed: String) { 
     self.text = "Hello, World!" 
     self.fontSize = 65; 
     self.position = CGPoint(x: 400, y: 500); 
     super.init(fontNamed: fontNamed) 
    } 

To ze względu na bezpieczeństwo i zostało wyjaśnione w sesji 403 WWDC, Intermediate Swift.

+1

Dzięki Cojoj, ale to nie działa, ponieważ dostaniesz błąd, że użyłeś 'text' przed wywołaniem' init'. Najpierw musisz "super.init". – jonallured

2

To wydaje się lepiej pracować:

class LinkLabel: SKLabelNode { 

    override init() { 
     super.init() 
    } 

    override init(fontNamed fontName: String!) { 
     super.init(fontNamed: fontName) 
     self.text = "Hello, World!" 
     self.fontSize = 65; 
     self.position = CGPoint(x: 400, y: 500); 
    } 

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

} 
Powiązane problemy