Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
过滤包含swift中数组的对象数组_Swift - Fatal编程技术网

过滤包含swift中数组的对象数组

过滤包含swift中数组的对象数组,swift,Swift,我试图通过数组进行搜索,以根据用户的搜索文本返回对象。下面是我正在使用的数据结构。我正在使用搜索栏获取搜索文本 var objects = [SomeObject]() //array of objects var filteredObject = [SomeObject]() //filtered array var isSearching = false struct SomeObject { var sectionName: String var secti

我试图通过数组进行搜索,以根据用户的搜索文本返回对象。下面是我正在使用的数据结构。我正在使用搜索栏获取搜索文本

var objects = [SomeObject]()      //array of objects

var filteredObject = [SomeObject]()  //filtered array
var isSearching = false

struct SomeObject {
    var sectionName: String
    var sectionObjects : [History]
}

struct History {
    var firstName: string
    var lastName: Int
}

func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
        filteredObject = objects.filter({ (obj: SomeObject) -> Bool in
            return obj.sectionObjects.filter { $0.firstName?.contains(searchText.lowercased()) as! Bool}
        })
        isSearching = true
        tableView.reloadData()
    }

我希望我的
filteredObject
返回包含搜索文本的sectionObjects
firstName
的对象。
搜索栏功能是进行筛选的地方。

您需要检查
sectionObjects
是否为空

filteredObject = objects.filter({ (obj: SomeObject) -> Bool in
     return !obj.sectionObjects.filter { $0.firstName.contains(searchText.lowercased())}.isEmpty
})

但是与其使用内部的
过滤器
,不如使用
包含

obj.sectionObjects.contains { $0.firstName.contains(searchText.lowercased()) != nil}

func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
    if searchText.isEmpty {
        isSearching = false
        filteredObject.removeAll()
    } else {
        filteredObject = objects.filter({ object -> Bool in
            return object.sectionObjects.contains{ $0.firstName.range(of: searchText, options: .caseInsensitive) != nil }
        })
        isSearching = true
    }
    tableView.reloadData()
}

首先,您必须考虑文本字段为空以取消搜索的情况。

其次,基本上您必须检查
sectionObjects
中是否(至少)有一个
firstName
项包含搜索字符串。因此,外部函数进行
过滤
,内部首先检查
是否包含

obj.sectionObjects.contains { $0.firstName.contains(searchText.lowercased()) != nil}

func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
    if searchText.isEmpty {
        isSearching = false
        filteredObject.removeAll()
    } else {
        filteredObject = objects.filter({ object -> Bool in
            return object.sectionObjects.contains{ $0.firstName.range(of: searchText, options: .caseInsensitive) != nil }
        })
        isSearching = true
    }
    tableView.reloadData()
}
旁注:


$0.firstName?.contains(searchText.lowercased()
返回
false
如果
firstName
jon并且您搜索Jo,则返回
范围(of
with
不区分大小写
选项在两侧搜索不区分大小写。

您的代码中没有任何内容是字典…我已更新@sweederbetter use
contains()
,它应该在第一次匹配时停止,而不是选中
isEmpty
obj.sectionObjects.contains{$0.firstName.contains(searchText.lowercased())!=nil}
Xcode一直在抱怨,直到我在末尾添加了
!=nil
。感谢您的帮助,我希望
部分对象也能被过滤,所以应该使用过滤器而不是容器。注意使用
包含(其中:)
首先读取
(其中:)!=nil
?有什么我不知道的原因吗?只是习惯。
包含(其中
的引入时间比
的引入时间要晚得多)(where
。但我认为在性能方面没有太大区别。我认为性能是一样的,只是更注重可读性。感谢您的帮助sectionObjects也需要过滤