我正在尝试对人员进行筛选和排列,并按特定顺序获取结果。这意味着当用户输入someString时,我想首先向人们展示其名称与someString匹配的人,然后以该someString开头,然后是包含该字符串的任何名称。
我可以使用“过滤器”数组执行任何操作,还是在此之后必须执行另一种手动排序?

这是我的过滤代码:

self.filteredNames = self.names.filter({$0.name.lowercaseString.hasPrefix(text!) | $0.name.lowercaseString.containsString(text!) | $0.allEmails.lowercaseString.containsString(text!.lowercaseString) | $0.allNumbers.lowercaseString.containsString(text!.lowercaseString)})

最佳答案

filter只能从集合中删除项目。它无法为您执行任何订购操作。

您可能希望使用数组的一次传递来解决此问题,以便其表现良好。不要使用过滤器,而要做类似以下的基本操作:

var query = "test"

let allStrings = ["another test", "test", "testing", "random"]

var matchStrings = [String]()
var prefixStrings = [String]()
var containsStrings = [String]()

for str in allStrings {

    if query == str {
        matchStrings.append(str)
    } else if str.hasPrefix(query) {
        prefixStrings.append(str)
    } else if str.containsString(query) {
        containsStrings.append(str)
    }
}

let results = matchStrings + prefixStrings + containsStrings

09-25 19:01