2017-05-24 6 views
1

Je fais une application rythmique, mais je n'arrive pas à randomiser les cercles. Voici mon code:Le membre d'instance de Swift 2 'circleIndexes' ne peut pas être utilisé sur le type 'GameScene'

var alternator = 0 
var fallTimer:NSTimer? 
var flag:Bool = true 

let circleIndexes = (0..<5).map { return NSNumber(integer: $0) } 

let randomIndexes = GKRandomSource.sharedRandom().arrayByShufflingObjectsInArray(circleIndexes) as! [Int] 

func fallCircleWrapper() { 

    if (flag == true) { 
     self.alternator += 1 
    } else { 
     self.alternator -= 1 
    } 

    if (self.alternator == 0) { 
     flag = true 
    } else if (self.alternator == 5) { 
     flag = false 
    } 

    self.hitAreaArray[randomIndexes[self.alternator]].emitNote(self.texture!) 

} 

Le problème est avec cette ligne:

let randomIndexes = GKRandomSource.sharedRandom().arrayByShufflingObjectsInArray(circleIndexes) as! [Int] 

qui donne l'erreur "membre d'instance 'circleIndexes' ne peut pas être utilisé sur le type 'GameScene'". Comment dois-je faire pour réparer cela?

+1

S'agit-il de propriétés d'une * classe? * Dans ce cas, il s'agit d'un doublon de [Comment initialiser les propriétés qui dépendent les unes des autres] (https://stackoverflow.com/questions/25854300/how-to-initialize -propriétés-qui-dépendent-de-l'autre). –

+1

Pourquoi utilisez-vous Swift 2 au lieu de 3 pour une nouvelle application? – TheValyreanGroup

Répondre

1

Considérons cet exemple qui reproduit votre erreur sur une échelle plus simple:

func agePlusOne(_ num: Int) -> Int { return num + 1 } 

class Cat { 

    var age = 5 
    var addedAge = agePlusOne(age) // ERROR! 
} 

Vous essayez d'utiliser une propriété/avant/il a été initialisé ... qui est, avant init() a terminé , vous donnant ainsi un self pour travailler. Un moyen de contourner ceci est d'utiliser les propriétés lazy ... les propriétés fainéantes sont initialisées uniquement lorsqu'elles sont appelées par un objet, c'est-à-dire qu'elles ne sont correctement initialisées qu'après l'affichage d'un self.

private(set) lazy var randomIndices: [Int] = { 
GKRandomSource.sharedRandom().arrayByShufflingObjectsInArray(self.circleIndexes) as! [Int] 
}() 

Les propriétés calculées et statiques sont également paresseuses par défaut, sans avoir besoin d'utiliser le mot-clé. Malheureusement, vous ne pouvez pas utiliser lazy let, donc le private(set) a été ajouté pour vous donner plus d'immuabilité, mais pas total. PS, il s'agit de Swift3, vous devrez peut-être le convertir en Swift2.