2017-04-11 1 views
0

Je suis très nouveau avec Swift et je n'arrive pas à le comprendre. J'ai besoin de compter le nombre d'instances créées à l'intérieur d'une structure. Depuis que j'ai créé 3 instances, comment puis-je obtenir le programme pour me dire qu'il y en a trois? J'ai essayé le exNames.count à la fin, mais cela ne fonctionne pas ... Merci!Comptage du nombre d'instances à l'intérieur d'une structure dans swift

struct People { 
    let name: String 
    var age: Int 
    let sex: Character 
} 

var heather = People(name: "Heather", age: 32, sex: "F") 
var peter = People(name: "Peter", age: 34, sex: "M") 
var scott = People(name: "Scott", age: 27, sex: "M") 

let exNames = [People]() 

exNames.count 
+5

'exNames' est un tableau vide. - Jetez un oeil à http://stackoverflow.com/questions/38021844/count-number-of-instances-of-a-class-swift. –

Répondre

2

Vous souhaitez utiliser une variable statique sur la structure People. Cependant, cela nécessite de remplacer l'initialiseur par défaut.

struct People 
{ 
    static var instances = 0 

    let name:String 
    var age:Int 
    let sex:Character 

    init(name:String, age:Int, sex:Character) 
    { 
     self.name = name 
     self.age = age 
     self.sex = sex 

     People.instances += 1 
    } 
} 

var heather = People(name: "Heather", age: 32, sex: "F") 
var peter = People(name: "Peter", age: 34, sex: "M") 
var scott = People(name: "Scott", age: 27, sex: "M") 

let exNames = [People]() 
/* exNames.count only gives the number of People that are 
contained in this particular array, which is zero. */ 

print(People.instances) // 3 

Si vous voulez décrément le compte lorsque les struct s sont hors de portée, vous devez passer à un class qui fournit un deinitializer deinit {}. Notez que les cas d'utilisation «appropriés» pour un compteur statique sont extrêmement limités. Il est très probable que le problème que vous essayez de résoudre serait mieux servi par un autre marteau.

Par ailleurs, vous devriez vraiment pas utiliser Character pour représenter sex, comme Character à Swift est très étroitement liée à des chaînes, et ils sont conçus et optimisés à des fins lexicales, et non pour signaler. Il ouvre également la porte à de nombreux bugs potentiels, car Swift ne pourra pas non plus vérifier les entrées valides (que se passe-t-il si quelqu'un passe accidentellement une valeur de "@"?). enum si vous avez besoin de plus de fonctionnalités.

2

On dirait que vous vouliez créer un tableau de personnes, dans ce cas:

struct People { 
    let name: String 
    var age: Int 
    let sex: Character 
} 

var heather = People(name: "Heather", age: 32, sex: "F") 
var peter = People(name: "Peter", age: 34, sex: "M") 
var scott = People(name: "Scott", age: 27, sex: "M") 

//This should be a var, because you are going to modify it 
var exNames = [People]() 

exNames.append(heather) 
exNames.append(peter) 
exNames.append(scott) 

exNames.count