2016-10-21 3 views
0

Ich muss eine Zeichenfolge auf der Grundlage einiger Logik verketten, aber ich kann nicht herausfinden, wie es geht.Swift verketten Zeichenfolge basierend auf verschiedenen Werten

Beispiel:

var filterString: String = "" 
var hasFilter: Bool = false 

    if let catId = param["catid"] { 
     filterString += "cat_id=\(catId)" 
     hasFilter = true 
    } 

    if let subCatId = param["subcatid"] { 
     filterString += "sub_cat_id=\(subCatId)" 
     hasFilter = true 
    } 

    if let locationId = param["stateid"] { 
     filterString += "location_id=\(locationId)" 
     hasFilter = true 
    } 


    if hasFilter == true { 
     query.filters = filterString 
    } 

Dies funktioniert nur, wenn ich ONE Filter in meiner Anfrage haben

ZB: query.filters = "location_id=4"

Aber wenn ich happend zwei oder mehr Filter meiner Anfrage haben wird zB:

query.filters = "location_id=4cat_id=3" 

Wenn ich mehr als ein Filter, muss ich es mit einer UND Anweisung wie folgt trennen:

query.filters = "location_id=4 AND cat_id=3" 

Aber ich kann nicht herausfinden, wie es zu tun, da ich weiß nie, was die Filterordnung wird kommen, oder wenn es auch ein oder mehrere Filter sein mit

bearbeiten beginnen

ich scheine es durch zum Laufen zu bringen:

var filterString: String = "" 
    var hasFilter: Bool = false 

     if let catId = param["catid"] { 
      filterString += "cat_id=\(catId)" 
      hasFilter = true 
     } 

     if let subCatId = param["subcatid"] { 
      if hasFilter == true { 
      filterString += " AND sub_cat_id=\(subCatId)" 
      } else { 
      filterString += "sub_cat_id=\(subCatId)" 
      } 
      hasFilter = true 
     } 

     if let locationId = param["stateid"] { 
     if hasFilter == true { 
     filterString += " AND location_id=\(locationId)" 
     } else { 
      filterString += "location_id=\(locationId)" 
      } 
      hasFilter = true 
     } 


     if hasFilter == true { 
      query.filters = filterString 
     } 
+0

Ist das ein NSPredicate für den Bau? In diesem Fall empfehle ich dringend, NSCompoundPredicate und PrädikatWithFormat zu verwenden: statt String-Manipulation. Hier sind einige Beispiele: http://StackOverflow.com/Questions/39027558/how-to-combine-multiple-nullable-nspredicates, http://StackOverflow.com/Questions/34202239/NPredicate-with-Multiple-arguments-and und Verhalten. –

+0

@MartinR Nein, ich verwende dies: http://algolia.com/ – user2636197

+2

Bitte posten Sie Ihre endgültige Lösung nicht als Bearbeitung Ihrer Frage. Wenn Sie Ihr eigenes Problem gelöst haben (auch wenn es nicht der beste Weg ist, es zu lösen), sollten Sie es als Antwort, nicht als Bearbeitung Ihrer Frage veröffentlichen. – rmaddy

Antwort

2

Eine Lösung wäre, die Filter in ein Array zu stellen und dann, wenn das Array nicht leer ist, die Array-Werte mit einem " AND " Trennzeichen zu kombinieren.

var filters : [String] = [] 
if let catId = param["catid"] { 
    filters.append("cat_id=\(catId)") 
} 

if let subCatId = param["subcatid"] { 
    filters.append("sub_cat_id=\(subCatId)") 
} 

if let locationId = param["stateid"] { 
    filters.append("location_id=\(locationId)") 
} 

if filters.count > 0 { 
    query.filters = filters.joined(separator: " AND ") 
} 
+0

Ich scheine es jetzt funktionieren zu lassen, ich postete meinen aktualisierten Code :) – user2636197

+2

Warum ist es schwer? Das sind viele unnötige 'if' Anweisungen und redundanter Code. – rmaddy

+0

Oh Entschuldigung, ich habe es nicht verstanden. '' query.filters'' muss einer Zeichenkette entsprechen. Und ich dachte, '' query.filters = filters.joined (separator: "AND") '' würde es nur dann zur Zeichenkette machen, wenn mehr als ein Element vorhanden wäre. – user2636197

0

Vielleicht können Sie zunächst ein Array erstellen und alle Filter anhängen. Danach erstellen Sie eine weitere Variable, um alle Werte im Array anzuhängen.

+0

Ich scheine es jetzt funktionieren zu lassen, ich postete meinen aktualisierten Code :) – user2636197

0

Eine weitere Möglichkeit, mittels Inline-if-Anweisungen:

var param = ["catid" : "111", "subcatid" : "222", "stateid" : "333"] 

    var filterString = "" 

    if let catId = param["catid"] { 
     filterString = "cat_id=\(catId)" 
    } 

    if let subCatId = param["subcatid"] { 
     filterString.appendContentsOf(filterString.characters.count > 0 ? " AND sub_cat_id=\(subCatId)" : "sub_cat_id=\(subCatId)") 
    } 

    if let locationId = param["stateid"] { 
     filterString.appendContentsOf(filterString.characters.count > 0 ? " AND location_id=\(locationId)" : "location_id=\(locationId)") 
    } 

    print(filterString) 

    if (filterString.characters.count > 0) { 
     query.filters = filterString 
    } 
+1

Ich scheine es jetzt funktionieren zu lassen, ich postete meinen aktualisierten Code :) – user2636197

+0

Dies ist ineffizient und umständlich, weil Sie die Zeichenanzahl jedes Mal überprüfen und die Zeichenfolge jedes Mal duplizieren müssen. – rmaddy

Verwandte Themen