2016-10-21 27 views
0

我需要连接基于某种逻辑的字符串,但我无法弄清楚如何做到这一点。基于不同值的Swift连接字符串

例子:query.filters = "location_id=4"

但是,如果我happend有两个或多个过滤器我的查询:

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 
    } 

这将只有当我在我的查询

例如有ONE过滤器工作将打破例如:

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

如果我有一个以上的过滤器,我需要用AND语句像这样单独它:

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

但我无法弄清楚如何做到这一点,因为我从来不知道什么样的顺序过滤器会在或有甚至将一个或多个过滤器开始与

编辑

我好像得到它的工作方式:

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

这是为建设一个NSPredicate?在这种情况下,我强烈建议使用NSCompoundPredicate和predicateWithFormat:而不是字符串操作。这里有一些例子:http://stackoverflow.com/questions/39027558/how-to-combine-multiple-nullable-nspredicates,http://stackoverflow.com/questions/34202239/nspredicate-with-multiple-arguments-and -and行为。 –

+0

@MartinR不,我使用这个:http://algolia.com/ – user2636197

+2

请不要发布您的最终解决方案作为您的问题的编辑。如果你已经解决了你自己的问题(即使它不是解决问题的最佳方法),你应该将它作为答案发布,而不是编辑你的问题。 – rmaddy

回答

2

一种解决方案是将过滤器放入数组中,然后如果数组不为空,则将数组值与" AND "分隔符组合。

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

我似乎得到它现在的工作,我张贴我更新的代码:) – user2636197

+2

为什么这是困难的方式?这是很多不必要的if语句和冗余代码。 – rmaddy

+0

对不起,我不明白。 ''query.filters''必须等于一个字符串。我认为''query.filters = filters.joined(separator:“AND”)''只会在一个以上的项目中生成一个字符串 – user2636197

0

也许你可以先创建一个数组并追加所有的过滤器。 之后,创建另一个变量来追加数组中的所有值。

+0

我似乎得到它现在的工作,我发布我的更新的代码:) – user2636197

0

使用内联的另一种选择,如果语句:

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

我似乎得到它现在工作,我发布我的更新的代码:) – user2636197

+0

这是低效率和繁琐的,因为您必须每次检查字符数并每次复制字符串。 – rmaddy

相关问题