Je suis (relativement) nouveau à la programmation. Je travaillais à travers "Introduction au développement de l'App Apple" et, comme il n'y a pas de livret de réponse, j'ai eu à travailler seuls les choses. Cependant, il y a des choses dont je suis un peu confus sur:
Il y a un problème que je travaille sur: P>
Ce terrain de jeu a un type de poulet intégré à celui-ci. Un poulet a une propriété de race et de tempérament, et les deux propriétés sont enums. P>
Voici un tableau de poulets: Poulets = [{Silkie, Grumpy} ...] P>
La tâche consiste à calculer le nombre de poulets de la race "lughorn" et de tempérament "hilarant" il y a dans le tableau. J'ai proposé le code suivant: p> Ça fonctionne, mais je me demande s'il y a un moyen plus efficace de le faire? Puis-je faire vérifier l'interrupteur chaque poulet pour {Leghorn, hilarant} et compter le nombre de poulets requis directement, plutôt que d'utiliser un commutateur imbriqué? (Toutes mes tentatives d'essayer moi-même ont été écrasées par des messages d'erreur de recherche effrayant, donc je suppose que non) en suivant, comment fonctionne-t-il? P> Quand j'ai appris à l'origine des boucles, j'avais l'impression que les entiers étaient utilisés pour boucler, par exemple. La première boucle était i = 0 et le code à l'intérieur effectué, puis la deuxième boucle était i = 1, etc., où "je" pourrait vraiment être quelque chose et que l'idée serait la même chose. Ici, "poulet" est utilisé. Pourquoi est-ce que je peux régler la condition au poulet.Temper? Qu'est-ce que le poulet signifie ici? Est-ce que A pour la boucle respecte le type de la matrice en boucle? C'est ce qui se passe réellement ici quelque chose comme "Prendre le 0ème poulet dans le tableau des poulets, appeler ça un" poulet ", puis vérifier son tempérament"? P> P>
3 Réponses :
Bienvenue dans la programmation.Cette est le modèle de votre scénario.
print(chickens.filter({$0.breed == .leghorn && $0.temper == .hilarious}).count)
Swift est un type de type {$ 0.breed == .leghorn && $ 0.Temper == .Hileux} code> Il s'applique également à votre méthode d'append .init (ID: 1, race:. Leghorn, tempérament: .Hiliers) code>. BTW Pourquoi utilisez-vous des propriétés statiques dans vos énumérations au lieu de cas réguliers? Enum Temper: String {Case hilarant, Autre} code>
Si l'intention est d'éviter d'utiliser la propriété RAWVALUE CODE> mieux utiliser une structure
@Leodabus merci à mes instructions. Je viens d'utiliser le type statique pour expliquer la méthode du filtre.
Jetez un coup d'œil à mon commentaire à la réponse de Ben. il s'applique ici aussi
La chose Swift-Y à faire dans ces situations est de sortir carte () em>, réduire () em>, compactmap () em>, et filtre () em> - dans votre cas, filtre () em>: (Merci d'avoir fait votre exemple drôle!) Dans votre pseudo-code, votre boucle est un peu nid-y, et cela peut être difficile à lire. (Le mien n'est probablement pas beaucoup plus facile - j'aimerais avoir une critique de code!) Vous déclarez en fait un poulet em> qui va être attribué la valeur de chaque élément de poulets em> à son tour. Vous pouvez le faire avec n'importe quelle séquence em>, comme une matrice, une carte ou un ensemble. P> Pour obtenir une vieille école pour boucle, vous pouvez faire boucle à travers une gamme: for i in 1...5 {
print(i)
}
Une autre option consiste à utiliser réduire au lieu de filtrer les éléments et d'accéder ultérieurement au nombre de résultats poulets.reduce (0) {$ 1.breed == .leghorn && $ 1.Temper == .Hileux? 0 $ + 1: $ 0} code>
Eh bien, la première chose que je mentionnerai est que votre approche fonctionne. Comme vous le soupçonnez, ce n'est pas l'approche la plus élégante - mais vous êtes déjà instinctivement conscient de cela.
La fonctionnalité du filtre à SWIFT est puissante et efficace, et l'exemple de Dilan vous mettra dans la bonne direction pour commencer à explorer cela. Mais vous voudrez bien développer une bonne compréhension du flux de contrôle, à part des caractéristiques de programmation fonctionnelle telles que la carte, la réduction et le filtre. P>
Pour cette situation si vous recherchez seulement une combinaison de race et tempérament, alors probablement une instruction de base si elle est plus propre que d'utiliser le commutateur. P>
var bantamCount = 0
var leghornCount = 0
var unknownBreedCount = 0
var chillCount = 0
var hilariousCount = 0
var unknownTemperCount = 0
for chicken in chickens {
switch chicken.breed {
case .bantam:
bantamCount += 1
case .leghorn:
leghornCount += 1
default:
unknownBreedCount += 1
}
switch chicken.temper {
case .chill:
chillCount += 1
case .hilarious:
hilariousCount += 1
default:
unknownTemperCount += 1
}
}