1
votes

Comment puis-je écrire une condition if raccourcie?

Quelqu'un a-t-il une idée de la façon d'écrire le code suivant sous une forme abrégée?

if self.atPoint(locationUser) == blueMarkArray[0] || self.atPoint(locationUser) == blueMarkArray[1] || self.atPoint(locationUser) == blueMarkArray[2] || self.atPoint(locationUser) == blueMarkArray[3] || self.atPoint(locationUser) == blueMarkArray[4] || self.atPoint(locationUser) == blueMarkArray[5] || self.atPoint(locationUser) == blueMarkArray[6]{

            print("its here")
        }

De plus, je ne veux pas m'engager sur un nombre fixe d'éléments dans le tableau blueMarkArray . Il doit être aussi variable que possible, car par exemple il peut contenir 4 éléments, mais aussi 12 éléments.

Pour chaque réponse, je suis très reconnaissant.

EDIT:

Comment pouvez-vous accéder à l'élément trouvé si je veux écrire ce qui suit: someNode.position = elementOfMarkArray.position


7 commentaires

Ce n'est probablement pas un doublon car je ne pense pas que vous souhaitiez tester si un point est dans la liste de cette manière, en raison de problèmes de précision en virgule flottante. Vous voudrez probablement tester si le point est proche de l'un de ces points en calculant leur distance.


La réponse à votre question ajoutée est disponible ici: stackoverflow.com/a/24069331 .


@MartinR Je crois que vous avez tort de marquer cette question comme un autre problème de recherche dans la liste . Veuillez voter pour rouvrir.


@trojanfoe: Si je comprends bien, OP demande comment raccourcir la comparaison avec plusieurs éléments de tableau, ou comment trouver sa position dans un tableau. Cela a déjà été demandé et répondu. - Il est possible de trouver l’élément de tableau le plus "proche", mais ce n’est pas ce qui est demandé ici.


@MartinR A convenu que le PO n'a pas posé la question correctement; en plus d'ignorer les nuisances des classes de collection, etc., ils semblent manquer de compréhension des graphiques 2D.


@trojanfoe: Je ne t'ai pas vu ici depuis un moment - bon retour!


@MartinR Ouais ça fait un moment. Merci beaucoup!


3 Réponses :


3
votes

Utilisez la méthode contains du tableau

if let index = blueMarkArray.firstIndex(of: self.atPoint(locationUser)) {
   //
}

ou, si vous ne devez vérifier que jusqu'à l'index 6 comme dans votre exemple, utilisez

if (blueMarkArray[0...6].contains(self.atPoint(locationUser))) {
   //
}

si vous souhaitez obtenir l'index de l'élément, vous pouvez utiliser les méthodes firstIndex des lastIndex p >

if (blueMarkArray.contains(self.atPoint(locationUser))) {
   //
}


6 commentaires

Cela fonctionne, mais comment pouvez-vous accéder à l'élément trouvé si je veux écrire ce qui suit: someNode.position = elementOfMarkArray.position


Voir la réponse mise à jour


Votre premier et deuxième exemple sont les mêmes, le second ne vérifie en fait que jusqu'à l'index 6. Il n'est pas non plus nécessaire d'utiliser des parenthèses pour la condition d'une instruction if dans Swift, contrairement à Objective- C (et le modèle commun est de ne pas les utiliser).


@ DávidPásztor une erreur lors de l'édition, maintenant corrigée


Malheureusement, je ne comprends toujours pas très bien comment utiliser index . Malheureusement, cela ne fonctionne pas de cette façon: if let index = blueMarkArray.firstIndex (of: self.atPoint (locationUser) as! SKSpriteNode) {someNode.position = index.position}


Je l'ai et ça marche. Merci beaucoup



1
votes

Vous devez simplement utiliser la méthode contains de Array , qui retournera true si l'un des éléments du tableau est égal à self.atPoint (locationUser) .

if let locationIndex = blueMarkArray.firstIndex(of: self.atPoint(locationUser)) {
   let location = blueMarkArray[locationIndex]
   someNode.position = location.position
}

Si vous avez également besoin d'accéder à l'élément qui correspond à l'objet / valeur que vous recherchez, vous pouvez utiliser en premier (où :) ou firstIndex(of:).

if let location = blueMarkArray.first(where: {$0 == self.atPoint(locationUser)}) {
    someNode.position = location.position
}

ou

if blueMarkArray.contains(self.atPoint(locationUser)) {
    print("it's here")
}


0 commentaires

1
votes

Vous pouvez utiliser la méthode array contains:

if blueMarkArray.contains(self.atPoint(locationUser)) {
    print("its here")
}


0 commentaires