【问题标题】:How can I sort a class using an array? - swift 5如何使用数组对类进行排序? - 迅速 5
【发布时间】:2020-07-09 02:47:49
【问题描述】:

我有一门叫“汽车”的课:

car1 = [name: "ferrari", color: "black", size: "small" ]
car2 = [name: "Lamborghini", color: "orange", size: "small" ]
car3 = [name: "Audi", color: "black", size: "big" ]
car4 = [name: "fiat", color: "yellow", size: "small" ]
car5 = [name: "ferrari", color: "red", size: "medium" ]

并列出了它们:

list = [car1,car2,car3,car4]

现在我想对这个列表进行排序/过滤。

如果我尝试使用字符串过滤它,一切正常:

let searchtext = "Audi"
filteredlist = list.filter({ $0.name.lowercased().contains(searchText.lowercased()) })
      --> filteredlist = [car3]   //result 

但我想使用一个数组,所以我可以显示更多结果。类似于通过一种以上的颜色进行过滤(类似于“if 语句”中的“或”条件)。

我尝试过相同的结构(但当然没有用):

let searchtext = ["black","red"]
filteredlist = list.filter({ $0.color.contains(searchText) })
    --> filteredlist = [car1,car3,car5]  //expected, got compilation error instead

我遇到了这些错误:

Cannot convert value of type 'String.Element' (aka 'Character') to expected argument type 'String'  
Instance method 'contains' requires that '[String]' conform to 'StringProtocol'

我可以考虑 2 个解决方案(不是理想的解决方案)来解决这个需求:

1 - 创建一个 while/for 函数并为 searchtext 数组的每个元素过滤列表,最后将所有内容合并(不推荐,因为我必须阅读列表'n'次)

更新:愚蠢的方式

var i = 0
var listapp: [Item] = []
while i < searchtext.count {
    listapp.append(contentsOf: list.filter({ $0.tipo.contains(searchtext[i]) }))
    i += 1
}
list = listapp

2 - 使用 'if','or','while' 手动过滤列表,而不是使用 list.filter 函数

【问题讨论】:

  • 过滤list.filter { ($0.color == "black" || $0.color == "red") &amp;&amp; $0.name.lowercased() == "audi" }时可以使用AND和OR
  • 不知道有多少种可能性。这是一个用户输入
  • 您可以在过滤器函数中编写任意数量的代码。开始和结束大括号不必在同一行。

标签: ios arrays swift filter tableview


【解决方案1】:

反过来:

let searchtext = ["black","red"]
filteredlist = list.filter({ searchtext.contains($0.color) })

【讨论】:

  • 这样你不会找到darkred。原来的版本可以做到。
  • 一行行完美!
【解决方案2】:

双重contains 应该这样做:

let searchText = ["black", "red"].map { $0.lowercased() }
filteredlist = list.filter { item in
   let color = item.color.lowercased()
   return searchText.contains { text in color.contains(text) }
}

【讨论】:

    猜你喜欢
    • 2016-07-14
    • 2020-10-06
    • 1970-01-01
    • 1970-01-01
    • 2013-12-20
    • 1970-01-01
    • 1970-01-01
    • 2015-10-07
    • 1970-01-01
    相关资源
    最近更新 更多