2016-11-21 2 views
1

In Swift 3 Ich bin Filterung und wie so eine Anordnung zu schaffen (während sie durch ein bestehendes Array iterieren):swift 3 Filter mehrere „gleich nicht auf“ Bedingungen

self.uniqueAddresses = self.uniqueAddresses.filter { $0.lat != thisUniqueAddress.lat) && $0.lng != thisUniqueAddress.lng } 

ich von meinem neuen Array ausschließen möchten nur diese vorhandenen Objekte, die den BEIDEN Bedingungen entsprechen. Das heißt, wenn ein Objekt lat ist wie meins und sein lng ist auch wie meins, dann will ich es nicht in meinem neuen Array. Wenn jedoch einer von ihnen übereinstimmt, ist es kein Problem und es kann enthalten sein. Ich verwende den & & Operator, um mir beide Bedingungen zusammen zu geben, aber selbst wenn nur eine der Bedingungen wahr ist, stimmt es auch mit meinen Bedingungen überein und wird daher nicht in meinem neuen Array enthalten, was nicht das ist, was ich will. Ich habe versucht, sie zusammen mit Klammern zu gruppieren, aber ich bekomme die gleichen Ergebnisse.

+0

eigentlich habe ich mich nicht richtig ausgedrückt. Das neue Array sollte kein Objekt enthalten, das sowohl meinem lat als auch meinem lng entspricht. Deshalb schreibe ich "! = Lat" und "! = Ing", denn wenn sie die gleichen sind wie das, was ich bereits habe, will ich es nicht. Gerade jetzt, was passiert ist, dass, selbst wenn man das gleiche ist, es auch nicht enthalten ist, weil es denkt, dass ein Spiel –

+0

Ich meine Frage bearbeitet, um es ein wenig klarer zu machen –

+0

Danke. Die richtige Logik wurde in der Antwort von @Robert geschrieben –

Antwort

2

Es ist nur ein boolesches Logikproblem. Sie wollen, dass die Adresse in der Ausgabe-Array zu sein, wenn entweder die Breite einzigartig ist, oder die Länge ist einzigartig, so benötigen Sie einen or Operator, wo Sie sich gerade and haben:

self.uniqueAddresses = self.uniqueAddresses.filter { $0.lat != thisUniqueAddress.lat || $0.lng != thisUniqueAddress.lng } 

Hier ist Code-Test in Ihrem Spielplatz zu versuchen:

let thisUniqueAddress = (lat: 0, lng: 0) 
var uniqueAddresses:[(lat:Int,lng:Int)] = [(lat: 0, lng: 0), 
           (lat: 0, lng: 1), 
           (lat: 1, lng: 0), 
           (lat: 1, lng: 1)] 
uniqueAddresses = uniqueAddresses.filter {$0.lat != thisUniqueAddress.lat || $0.lng != thisUniqueAddress.lng} 
print(uniqueAddresses) 

Es gibt [(0, 1), (1, 0), (1, 1)], jedoch ohne den einen Punkt (0, 0), die sowohl auf .lat und .lng übereinstimmt.

+0

Ich weiß nicht warum, aber die Logik ist irgendwie anders als, wie mein Gehirn es irgendwie verarbeiten würde ..... danke, obwohl. Dies ist genau das, was ich gesucht habe und es funktioniert –

+0

@ChaimFriedman Ich weiß! Es sah genau so aus wie du es hattest. Ich musste die ganze Kurzschrift herausnehmen und eine separate Filterfunktion schreiben, um zu sehen, dass es nicht das getan hat, was ich dachte. – Robert