init()

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • In Swift muss man bei init() folgendermaßen vorgehen:

    1) Eigene Instanzvariablen initialisieren
    2) super.init()
    3) Überschreiben von Instanzvariablen der Superklasse

    Was macht man aber jetzt, wenn eine Instanzvariable Zugriff auf eine Superklassen Instanzvariable braucht um richtig initialisiert zu werden?
    Ein einfaches Beispiel, bei dem desiredPosition am Anfang auf die Position gelegt werden soll.

    Quellcode

    1. self.desiredPosition = CGPointMake(1,1)
    2. super.init()
    3. self.desiredPosition = self.position


    Einen kurzen, aber lesenswerten Artikel zu Swift init() gibt es übrigens hier: ashfurrow.com/blog/swift-initializers
  • Ich komm nicht zurande mit den neuen inits...

    Ich habe einen SKNode gesubclassed der init(texture: Texture!) überschreibt.

    Quellcode

    1. ​init(texture: SKTexture!)
    2. //instanzvariablen
    3. super.init()


    Wenn ich jetzt aber versuche von dieser Klasse ein Objekt zu erzeugen

    Quellcode

    1. ​let player = Player(texture: atlas.textureNamed("textureName"))


    Stürzt die App ab und sagt mir: Player.swift: 11: 11: fatal error: use of unimplemented initializer 'init(texture:color:size:)' for class 'Project.Player'

    Ich rufe das aber niemals auf. Nirgends. Wirklich!
    Na, dann versuch ich mal diesen trotzdem zu implementieren obwohl ich ihn nicht brauche.

    Quellcode

    1. ​ convenience init(texture: SKTexture!, color: UIColor!, size: CGSize) {
    2. self.init(texture: texture)
    3. }


    Jetzt komme ich in eine Endlosschleife und zwar wird meine init(texture: SKTexture!) aufgerufen, da ich ja so mein Objekt erzeuge. Dann wird aber mein convenience Konstruktor aufgerufen. WARUM? und dann wieder mein designated Konstruktor, dann wieder der convenience, ...

    Ich verstehe leider nicht warum dem so ist.
    Hat jemand eine Idee / Lösung?
  • joejohannesjoe schrieb:

    Warum steht da zwei mal texture? Wo ist da der Sinn dahinter?

    Du veränderst mit dem ersten texture die Methodensignatur, und das zweite ist der Parametername:

    Quellcode

    1. init(texture inTexture: SKTexture!)

    Damit kannst Du mehrere Methoden mit dem gleichen Namen anlegen:

    Quellcode

    1. convenience init(texture inTexture: SKTexture!) { ... }
    2. convenience init(color inColor: SKColor!) { ... }

    und die dann beim Aufruf unterscheiden:

    Quellcode

    1. let thePlayer1 = Player(color: SKColor(...));
    2. let thePlayer2 = Player(texture: SKTexture(...));
    „Meine Komplikation hatte eine Komplikation.“
  • joejohannesjoe schrieb:

    Stürzt die App ab und sagt mir: Player.swift: 11: 11: fatal error: use of unimplemented initializer 'init(texture:color:size:)' for class 'Project.Player'


    Dazu habe ich bei StackOverflow etwas gelesen. Komischerweise ruft SKSpriteNode die init Funktion deiner Subklasse auf, anstatt den eigenen. Deshalb musst du diesen initializer auch bei der Subklasse implementieren.

    Ich hätte noch eine Frage. Warum können Swift Subklassen nicht einen convenience initializer der Superklasse aufrufen? Dieser muss doch dann sowieso den designated aufrufen. Das Problem tritt z.B. bei Subklassen von SKShapeNode auf. Anstatt init(circleOfRadius:) muss ich den designated initializer verwenden.
  • Hierzu muss ich aber sagen, dass das Problem schon bei Objective-C bestand und nichts mit Swift zu tun hat.

    Ein DI darf niemals einen CI der Superklasse aufrufen, da dieser den DI der Superklasse aufruft, der aber in der Subklasse ein CI sein könnte, mit der Folge, dass der DI der Subklasse ausgeführt wird, was zum Anfang diesen verworrenen Satzes führt.
    Es hat noch nie etwas gefunzt. To tear down the Wall would be a Werror!
    25.06.2016: [Swift] gehört zu meinen *Favorite Tags* auf SO. In welcher Bedeutung von "favorite"?
  • macmoonshine schrieb:

    Amin Negm-Awad schrieb:

    was zum Anfang diesen verworrenen Satzes führt.
    </span></p>

    <p>Geh nie tief, Herr Negm-Awad, geh nie tief. ;) +scnr+
    </p>

    <p>Da, tief! Irgendwer hat &uuml;brigens Dein Avatar gegen eine total miese Visage ausgetauscht. Wurde Dein Account gehackt?&nbsp;<img alt="cheeky" src="http://osxentwicklerforum.de/wcf/js/3rdParty/ckeditor/plugins/smiley/images/tongue_smile.png" style="height:23px; width:23px" title="cheeky" />