【问题标题】:Swift concatenate string based on different valuesSwift根据不同的值连接字符串
【发布时间】:2016-10-21 14:19:04
【问题描述】:

我需要根据一些逻辑连接一个字符串,但我不知道该怎么做。

例子:

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=4"

但如果我碰巧有两个或更多过滤器,我的查询就会中断,例如:

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
        }

【问题讨论】:

  • 这是为了构建一个 NSPredicate 吗?在这种情况下,我强烈建议使用 NSCompoundPredicate 和 predicateWithFormat: 而不是字符串操作。以下是一些示例:stackoverflow.com/questions/39027558/…stackoverflow.com/questions/34202239/…
  • @MartinR 不,我正在使用这个:algolia.com
  • 请不要发布您的最终解决方案作为对您问题的修改。如果您已经解决了自己的问题(即使它不是解决问题的最佳方法),您应该将其作为答案发布,而不是对您的问题进行编辑。

标签: ios swift string logic


【解决方案1】:

一种解决方案是将过滤器放入数组中,然后如果数组不为空,则将数组值与" 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 ")
}

【讨论】:

  • 我现在似乎可以正常工作了,我发布了我的更新代码 :)
  • 为什么要这样做?这是很多不必要的if 语句和冗余代码。
  • 抱歉,我没听懂。 query.filters 必须等于一个字符串。而且我认为query.filters = filters.joined(separator: " AND ") 只会在有多个项目时才将其设为字符串
  • 没有。无论数组中有多少个,filters.joined 都会返回 Stringif 检查只是确保至少有一个。
  • 啊太棒了!但是它如何知道何时添加" AND " 如果有多个元素,它会这样做吗?
【解决方案2】:

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

【讨论】:

  • 我现在似乎可以正常工作了,我发布了我的更新代码 :)
【解决方案3】:

使用内联 if 语句的另一个选项:

    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
    }

【讨论】:

  • 我现在似乎可以正常工作了,我发布了我的更新代码 :)
  • 这样既低效又麻烦,因为每次都要检查字符数,每次都要复制字符串。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-01-04
  • 2016-08-21
  • 2018-10-18
  • 1970-01-01
  • 2012-11-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多