2017-09-08 1 views
1

J'ai créé deux classes une classe Personne et une classe alimentaire. Maintenant, je fais la liste de tous les aliments consommés dans une année par une personne en particulier. Je veux imprimer tous séparés par des virgulesComment imprimer des éléments d'une classe en utilisant une variable d'une autre classe?

Voici mon code

class Food { 
     let name: String 
     var EatenBy: Person? 
     init(name: String){ 
      self.name = name 
     } 
    } 

Et ma classe Person est la suivante

class Person { 
     var name: String 
     var foods: [Food] = [] 

     lazy var foodNames:() -> String = { 
      return "" 
     } 

     init(name: String){ 
      self.name = name 
     } 

     func adopt(food: Food){ 
      foods.append(food) 
      food.EatenBy = self 
     } 
    } 

Maintenant, je veux créer différents produits alimentaires en utilisant la classe alimentaire puis attribuez-le à une personne qui les a consommés et rangez-les dans une série d'aliments.

var person = Person(name: "Test") 

var pasta = Food(name: "pasta") 

Quelqu'un peut me aider comment puis-je utiliser les objets créés à l'aide de classe pour l'alimentation et l'affecter à un objet créé dans la classe Person et les ajouter dans le tableau des aliments? Mon objectif final est d'imprimer tous les éléments de la matrice d'aliments en les séparant par des virgules ou des espaces ou autres, ce qui peut être facilement fait en bouclant chacun des éléments dans une boucle for.

Répondre

0

En utilisant une instance Person, vous pouvez accéder à ses propriétés (y compris le tableau foods par la syntaxe de points:.. person.foods

Pour imprimer les noms d'aliments, vous devez déclarer foodNames comme propriété calculée comme valeur de retour, il suffit d'utiliser map pour obtenir les noms de chaque instance Food, puis utilisez [String].joined(separator: ",") pour rejoindre le contenu du tableau de chaînes en une seule chaîne.

class Person { 
    var name: String 
    var foods: [Food] = [] 

    var foodNames:String { 
     return foods.map{$0.name}.joined(separator: ",") 
    } 

    init(name: String){ 
     self.name = name 
    } 

    func adopt(food: Food){ 
     foods.append(food) 
     food.EatenBy = self 
    } 
} 

class Food { 
    let name: String 
    var EatenBy: Person? 
    init(name: String){ 
     self.name = name 
    } 
} 

let john = Person(name: "John") 
let pasta = Food(name: "pasta") 
john.foods = [pasta, Food(name: "tuna")] //assign an array to the variable directly 
john.foods.append(Food(name: "tomato")) //or append the existing array 

john.adopt(food: Food(name: "bread")) //you can also use your _adopt_ function to add an element to the _foods_ array of a _Person_ instance 

john.foodNames // "pasta, tuna, tomato,bread" 

On dirait que vous êtes manquant quelques concepts de base sur le fonctionnement de Swift (comme l'utilisation de la syntaxe point pour accéder aux propriétés de classe), je recommande de commencer par The Swift Programming Language Guide, c'est un point de départ vraiment utile pour un développeur Swift débutant.

+0

Merci fonctionne comme j'ai requis. Merci pour le lien aussi, je vais le parcourir. –

+0

Une autre leçon rapide est de ne pas tout faire une classe. 'Person' a du sens car chaque instance est unique; il a une identité. Mais avoir une classe 'Food' ne le fait pas. Deux instances différentes de Bean ont deux références 'eatenBy' différentes. La propriété est déjà définie en étant incluse dans l'objet Personne. c'est-à-dire, parcourir toutes les personnes pour trouver celles qui ont des haricots dans leur gamme d'aliments. 'Food' pourrait être une structure ou une énumération. –

+0

@PriceRingo dépend de l'utilisation exacte de ces classes. Il peut être judicieux de faire de 'Food' une classe, par exemple s'il s'agissait de classes de base de données, cela aurait du sens, d'avoir une relation bidirectionnelle entre les deux classes. –