2016-07-27 28 views
0

Ich bin relativ neu zu Swift, und ich wollte wissen, ob es eine Möglichkeit gab, die Eigenschaft einer Klasse in einem separaten Klasseninitialisierer zu referenzieren? Zum Beispiel: Wenn ich eine Klasse Person mit der Eigenschaft position habe, gibt es eine Möglichkeit, eine Pants Klasse zu initialisieren, so dass ihre position das gleiche wie Person ist? Hier ist mein Code ist:Verwenden einer Klasse (oder Instanz) -Eigenschaft innerhalb eines anderen Klasseninitialisierer in swift

class Pants:SKSpriteNode{ 
     init(){ 

      let pants = SKTexture(imageNamed: "Sprites/pants.jpg") 

      pants.setScale(0.5) 

      super.init(texture: pants, color: UIColor.clearColor(), size: pants.size()) 

      //self.position.x = aPerson.position.x + (aPerson.size.width/2) 
      //self.position.y = aPerson.position.y - (aPerson.size.height * 0.04) 
      self.position = Person.getPos()//CGPoint(x: 200,y: 200) 
     } 

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

} 

Zuerst versuchte ich aPerson Referenzierung, die eine Instanz von Person ist, aber ich erhielt den Fehler: Instance member aPerson cannot be used on type GameScene. Ich denke, verstehen Sie, warum es nicht viel Sinn macht, in diesem Fall auf eine Instanz zu verweisen - da die Instanz zum Zeitpunkt der Referenz möglicherweise nicht existiert? Aber ich weiß nicht wirklich, was diese Fehlermeldung bedeutet - jede Klärung wäre großartig. Ich dachte dann, eine static Getter-Methode innerhalb der Person Klasse zu verwenden, die gerade ihre Position-Eigenschaft zurückgegeben hat. Das scheint auch nicht zu funktionieren. Irgendwelche Vorschläge wären großartig!

+1

Es scheint nicht viel Sinn machen für eine "Person" * Klasse eine Position zu haben - Instanzen dieser Klasse, einzelne Personen, haben Positionen. –

+0

@paulgriffiths Das macht eigentlich Sinn - irgendwelche Vorschläge, wie man das umsetzt? Als ich es versuchte, erhielt ich den Fehler: 'Instanzmitglied aPerson kann nicht am Typ GameScene verwendet werden? – Sam

+2

'Pants' benötigt Zugriff auf eine Instanz von 'Person', wenn Sie auf Instanzattribute zugreifen möchten. Sie können entweder einen an den Initialisierer übergeben oder Sie können einen Initialisierer erstellen, je nachdem, was für Ihre Anwendung sinnvoll ist. –

Antwort

2

Eine Lösung ist, um einen Parameter zu Ihrem initializer hinzuzufügen (wie von Paul Griffiths in einem Kommentar oben vorgeschlagen):

class Pants: SKSpriteNode { 
    init(aPerson: Person) { 
     let pants = SKTexture(imageNamed: "Sprites/pants.jpg") 
     pants.setScale(0.5) 

     super.init(texture: pants, color: UIColor.clearColor(), size: pants.size()) 

     self.position.x = aPerson.position.x + (aPerson.size.width/2) 
     self.position.y = aPerson.position.y - (aPerson.size.height * 0.04) 
     self.position = aPerson.getPos()//CGPoint(x: 200,y: 200) 
    } 

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

Dann, wo Sie eine Pants Instanz erstellen möchten, müssen Sie eine Person passieren:

let somePerson = Person() 
let pants = Pants(aPerson: somePerson) 
1

Ich nehme an, Hosen werden von Person getragen? arbeiten Sie stattdessen relativ, nicht absolut.

Machen Sie Hosen ein Kind Knoten der Person, dann alles, was Sie sich Sorgen machen müssen, ist die Entfernung vom Zentrum der Person, um die Hose Linie. Wenn dies immer eine konstante Zahl ist (wie 10 Pixel unter der Mitte), dann codiere es hart. Wenn die Hose Linie ändert, dann in der Hose Linie passieren wie @Santa Claus

schlägt ==== einige Code wird hier angenommen, bitte ======

person.pantline = -10; 
person.addChild(Pants(pantline:person.pantline)) 

======= ==============================

class Pants: SKSpriteNode { 
    convenience init(pantline: Int) { 

     self.init(imageNamed: "Sprites/pants.jpg") 
     self.setScale(0.5) //Why? 

     self.anchorPoint = CGPointMake(0.5,1) 
     self.position.y = pantline 
    } 

    required init?(coder aDecoder: NSCoder) { 
     super.init(coder:aDecoder) 
    } 
    override init (texture: SKTexture, color: UIColor, size: CGSize) 
    { 
     super.init(texture: texture, color: color, size: size) 
    } 

}